Learn Haskell in 10 minutes
From HaskellWiki
| Line 84: | Line 84: | ||
== Simple Types == | == Simple Types == | ||
| - | So far, not a single type has been mentioned | + | So far, not a single type declaration has been mentioned. That's because Haskell does type inference. You generally don't have to declare types unless you want to. If you do want to declare types, you use <hask>::</hask> to do it. |
| + | |||
| + | Prelude> <hask>5 :: Int</hask> | ||
| + | 5 | ||
| + | Prelude> <hask>5 :: Double</hask> | ||
| + | 5.0 | ||
| + | |||
| + | You can also ask ghci what type it has chosen for something. This is useful because you don't generally have to declare your types. | ||
| + | |||
| + | Prelude> :t <hask>True</hask> | ||
| + | <hask>True :: Bool</hask> | ||
| + | Prelude> :t <hask>'X'</hask> | ||
| + | <hask>'X' :: Char</hask> | ||
| + | Prelude> :t <hask>"Hello, Haskell"</hask> | ||
| + | <hask>"Hello, Haskell" :: [Char]</hask> | ||
| + | |||
| + | (In case you noticed, <hask>[Char]</hask> is another way of saying <hask>String</hask>. See the section on lists later.) | ||
| + | |||
| + | Things get more interesting for numbers. | ||
| + | |||
| + | Prelude> :t <hask>42</hask> | ||
| + | <hask>42 :: (Num t) => t</hask> | ||
| + | Prelude> :t <hask>42.0</hask> | ||
| + | <hask>42.0 :: (Fractional t) => t</hask> | ||
| + | Prelude> :t <hask>gcd 15 20</hask> | ||
| + | <hask>gcd 15 20 :: (Integral t) => t</hask> | ||
| + | |||
| + | These type signatures mean: | ||
| + | |||
| + | * <hask>42</hask> can be used as any numeric type. (This is why I was able to declare <hask>5<hask> as either an Int or a Double earlier.) | ||
| + | * <hask>42.0</hask> can be any fractional type, but not an integral type. | ||
| + | * <hask>gcd 15 20</hask> (which is a function call, incidentally) can be any integral type, but not a fractional type. | ||
| + | |||
| + | The feature used here is "type classes". We can say that types belong to the <hask>Num</hask> type class, or the <hask>Fractional</hask> type class, or the <hask>Integral</hask> type class. | ||
| + | |||
| + | There are five numeric types in the Haskell "prelude" (the part of the library you get without having to import anything): | ||
| + | |||
| + | * <hask>Int</hask> is an integer with at least 30 bits of precision. | ||
| + | * <hask>Integer</hask> is an integer with unlimited precision. | ||
| + | * <hask>Float</hask> is a single precision floating point number. | ||
| + | * <hask>Double</hask> is a double precision floating point number. | ||
| + | * <hask>Rational<hask> is a fraction type, with no rounding error. | ||
| + | |||
| + | All five of these belong to the <hask>Num</hask> type class. The first two belong to <hask>Integral</hask>, and the last two to <hask>Fractional</hask>. | ||
| + | |||
| + | Putting it all together, | ||
| + | |||
| + | Prelude> <hask>gcd 42 35 :: Int</hask> | ||
| + | 7 | ||
| + | Prelude> <hask>gcd 42 35 :: Double</hask> | ||
| + | |||
| + | <interactive>:1:0: | ||
| + | No instance for (Integral Double) | ||
| + | |||
| + | The final type worth mentioning here is <hask>()</hask>, pronounced "unit." It only has one value, also written as <hask>()</hask> and pronounced "unit." You can think of this as similar to the void keyword in C family languages. You can return <hask>()</hask> from a function or I/O action if you don't want to return anything. | ||
Revision as of 06:15, 13 July 2007
Contents |
1 Overview
Haskell is a functional (that is, everything is done with function calls), statically, implicitly typed (types are checked by the compiler, but you don't have to declare them), lazy (nothing is done until it needs to be) language. It's closest popular relative is probably the ML family of languages.
The most common Haskell compiler is GHC. You can download GHC from http://www.haskell.org/ghc/download_ghc_661.html. GHC binaries are available for Linux, FreeBSD, MacOS, Windows, and Solaris. Once you've installed GHC, you get two programs you're interested in right now: ghc, and ghci. The first compiles Haskell libraries or applications to binary code. The second is an interpreter that lets you write Haskell code and get feedback right away.
2 Simple Expressions
You can type most math expressions directly into ghci and get an answer.
Prelude>15Prelude>
15Prelude>
16Strings are in "double quotes." You can concatenate them with
"Hello"Prelude>
"Hello, Haskell"
Calling functions is done by putting the arguments directly after the function. There are no parentheses as part of the function call:
Prelude>6Prelude>
6Prelude>
7Prelude>
1.4142135623730951Prelude>
TruePrelude>
7
3 The Console
I/O actions can be used to read from and write to the console. Some common ones include:
Prelude>Hello, HaskellPrelude>
9Prelude>
TrueThe
2 + 2 = 4Prelude>
ABCDE 12345Reading can be done with
4 16
(The 4 was input. The 16 was a result.)
There is actually another way to writemain = do putStrLn "What is 2 + 2?" x <- readLn if x == 4 then putStrLn "You're right!" else putStrLn "You're wrong!"
4 Simple Types
So far, not a single type declaration has been mentioned. That's because Haskell does type inference. You generally don't have to declare types unless you want to. If you do want to declare types, you use5Prelude>
5.0
You can also ask ghci what type it has chosen for something. This is useful because you don't generally have to declare your types.
Prelude> :tThings get more interesting for numbers.
Prelude> :tThese type signatures mean:
- can be used as any numeric type. (This is why I was able to declare42can be any fractional type, but not an integral type.5<hask> as either an Int or a Double earlier.)
* <hask>42.0 - (which is a function call, incidentally) can be any integral type, but not a fractional type.gcd 15 20
There are five numeric types in the Haskell "prelude" (the part of the library you get without having to import anything):
- is an integer with at least 30 bits of precision.Int
- is an integer with unlimited precision.Integer
- is a single precision floating point number.Float
- is a double precision floating point number.Double
- type class. The first two belong toRational<hask> is a fraction type, with no rounding error.
All five of these belong to the <hask>Num, and the last two toIntegral.Fractional
Putting it all together,
Prelude>7Prelude>
<interactive>:1:0:
No instance for (Integral Double)
The final type worth mentioning here is 