Difference between revisions of "Cookbook/Compilers and interpreters"

From HaskellWiki
Jump to navigation Jump to search
(→‎General: use a less intimidating example)
 
(32 intermediate revisions by 2 users not shown)
Line 1: Line 1:
= Prelude =
+
== GHC ==
   
  +
{| class="wikitable"
A lot of functions are defined in the [http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html Prelude]. Also, if you ever want to search for a function, based on the name, type or module, take a look at the excellent [http://www.haskell.org/hoogle/ Hoogle]. This is for a lot of people a must-have while debugging and writing Haskell programs.
 
  +
|-
  +
! Problem
  +
! Solution
  +
! Examples
  +
|-
  +
| compiling and linking an executable
  +
| --make
  +
|<pre>ghc --make Main.hs --> Main</pre>
  +
|-
  +
| compiling without linking
  +
| -c
  +
|<pre>ghc -c Foo.hs --> Foo.hi, Foo.o</pre>
  +
|-
  +
| generating Assembler code
  +
| -S
  +
|<pre>ghc -S Foo.hs --> Foo.hi, Foo.s</pre>
  +
|-
  +
| generating C code
  +
| -C
  +
|<pre>ghc -C Foo.hs --> Foo.hc, Foo.hi</pre>
  +
|-
  +
| linking files into an executable
  +
| -o
  +
|<pre>ghc -o test Foo.o Bar.o Baz.p --> test</pre>
  +
|}
   
= GHCi/Hugs =
+
== GHCi ==
== GHCi interaction ==
 
To start GHCi from a command prompt, simply type `ghci'
 
   
  +
=== General ===
$ ghci
 
___ ___ _
 
/ _ \ /\ /\/ __(_)
 
/ /_\// /_/ / / | | GHC Interactive, version 6.6, for Haskell 98.
 
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
 
\____/\/ /_/\____/|_| Type :? for help.
 
 
Loading package base ... linking ... done.
 
Prelude>
 
   
  +
{| class="wikitable"
[http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html Prelude] is the "base" library of Haskell.
 
  +
|-
 
  +
! Problem
To create variables at the GHCi prompt, use `let'
 
  +
! Solution
<haskell>
 
  +
! Examples
Prelude> let x = 5
 
  +
|-
Prelude> x
 
  +
| checking a definition
5
 
  +
| :i
Prelude> let y = 3
 
  +
|<haskell>
Prelude> y
 
  +
Prelude> :i True
3
 
  +
data Bool = ... | True -- Defined in GHC.Bool
Prelude> x + y
 
8
 
 
</haskell>
 
</haskell>
  +
|-
  +
| checking a type
  +
| :t
  +
|<haskell>
  +
Prelude> :t "Hello"
  +
"Hello" :: [Char]
   
  +
Prelude> :t length
`let' is also the way to create simple functions at the GHCi prompt
 
  +
length :: [a] -> Int
<haskell>
 
Prelude> let fact n = product [1..n]
 
Prelude> fact 5
 
120
 
 
</haskell>
 
</haskell>
  +
|-
  +
| loading a file
  +
| :l
  +
|<haskell>
  +
Prelude> :l Foo.hs
  +
[1 of 1] Compiling Foo ( Foo.hs, interpreted )
  +
Ok, modules loaded: Foo.
  +
</haskell>
  +
|-
  +
| reloading all loaded files
  +
| :r
  +
|<haskell>
  +
Prelude> :r
  +
</haskell>
  +
|}
   
  +
=== Debugging ===
   
  +
{| class="wikitable"
== Checking Types ==
 
  +
|-
To check the type of an expression or function, use the command `:t'
 
  +
! Problem
<haskell>
 
  +
! Solution
Prelude> :t x
 
  +
! Examples
x :: Integer
 
  +
|-
Prelude> :t "Hello"
 
  +
| setting a break point
"Hello" :: [Char]
 
  +
| :break
</haskell>
 
  +
|<haskell>
Haskell has the following types defined in the [http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html Standard Prelude].
 
  +
Prelude> :break 2 -- sets a break point in line 2
<haskell>
 
Int -- bounded, word-sized integers
 
Integer -- unbounded integers
 
Double -- floating point values
 
Char -- characters
 
String -- equivalent to [Char], strings are lists of characters
 
() -- the unit type
 
Bool -- booleans
 
[a] -- lists
 
(a,b) -- tuples / product types
 
Either a b -- sum types
 
Maybe a -- optional values
 
 
</haskell>
 
</haskell>
  +
|}
  +
  +
== Hugs ==
  +
  +
TODO

Latest revision as of 08:33, 25 January 2010

GHC

Problem Solution Examples
compiling and linking an executable --make
ghc --make Main.hs               --> Main
compiling without linking -c
ghc -c Foo.hs                    --> Foo.hi, Foo.o
generating Assembler code -S
ghc -S Foo.hs                    --> Foo.hi, Foo.s
generating C code -C
ghc -C Foo.hs                    --> Foo.hc, Foo.hi
linking files into an executable -o
ghc -o test Foo.o Bar.o Baz.p    --> test

GHCi

General

Problem Solution Examples
checking a definition :i
Prelude> :i True
data Bool = ... | True  -- Defined in GHC.Bool
checking a type :t
Prelude> :t "Hello"
"Hello" :: [Char]

Prelude> :t length
length :: [a] -> Int
loading a file :l
Prelude> :l Foo.hs
[1 of 1] Compiling Foo              ( Foo.hs, interpreted )
Ok, modules loaded: Foo.
reloading all loaded files :r
Prelude> :r

Debugging

Problem Solution Examples
setting a break point :break
Prelude> :break 2    -- sets a break point in line 2

Hugs

TODO