Difference between revisions of "Cookbook/Compilers and interpreters"
< Cookbook
Jump to navigation
Jump to search
(Change Prelude and Hoogle links to HaskellWiki pages) |
(→General: use a less intimidating example) |
||
(30 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | = |
+ | == GHC == |
+ | {| class="wikitable" |
||
− | A lot of functions are defined in the [[Prelude]]. The Prelude is a standard module imported by default into all Haskell module. |
||
+ | |- |
||
+ | ! 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 == |
||
− | Also, if you ever want to search for a function, based on the name, type or module, take a look at the excellent [[Hoogle]]. This is for a lot of people a must-have while debugging and writing Haskell programs. |
||
− | = |
+ | === General === |
− | == GHCi interaction == |
||
− | To start GHCi from a command prompt, simply type `ghci' |
||
+ | {| class="wikitable" |
||
− | $ ghci |
||
+ | |- |
||
− | ___ ___ _ |
||
+ | ! Problem |
||
− | / _ \ /\ /\/ __(_) |
||
+ | ! Solution |
||
− | / /_\// /_/ / / | | GHC Interactive, version 6.6, for Haskell 98. |
||
+ | ! Examples |
||
− | / /_\\/ __ / /___| | http://www.haskell.org/ghc/ |
||
+ | |- |
||
− | \____/\/ /_/\____/|_| Type :? for help. |
||
+ | | checking a definition |
||
− | |||
+ | | :i |
||
− | Loading package base ... linking ... done. |
||
+ | |<haskell> |
||
− | Prelude> |
||
+ | Prelude> :i True |
||
− | |||
+ | data Bool = ... | True -- Defined in GHC.Bool |
||
− | [http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html Prelude] is the "base" library of Haskell. |
||
− | |||
− | To create variables at the GHCi prompt, use `let' |
||
− | <haskell> |
||
− | Prelude> let x = 5 |
||
− | Prelude> x |
||
− | 5 |
||
− | Prelude> let y = 3 |
||
− | Prelude> y |
||
− | 3 |
||
− | 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