Wednesday, 20 May 2015
When this is all installed you can run a REPL via GHCi which is the Glasgow Haskell Compiler Interactive and which opens up in a DOS box... or there is a Windows version of the same thing which opens in a regular Windows - er - window... and rather smoothly I find I can start the same thing inside Emacs.
In Emacs you can start the interpreter and load the file you're working in with C-c C-l, or just start the interactive mode with C-c C-b.
So, running the Haskell REPL, what can you do?
Firstly there are REPL commands: these start with a colon character. So firstly you can change to the folder where your code is going to be:
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :cd \users\polly\documents\projects\haskell
Volume in drive C is Windows
Volume Serial Number is 20F4-549E
Directory of C:\users\polly\documents\projects\haskell
02/05/2015 11:12 <DIR> .
02/05/2015 11:12 <DIR> ..
02/05/2015 11:14 978 #notes.txt#
02/05/2015 10:47 1,950,052 hello.exe
02/05/2015 10:46 544 hello.hi
02/05/2015 10:44 31 hello.hs
02/05/2015 10:46 1,772 hello.o
02/05/2015 11:05 860 notes.txt
02/05/2015 10:56 354 notes.txt~
11 File(s) 1,959,067 bytes
2 Dir(s) 88,516,657,152 bytes free
In here you can load your file and run it by calling the main function:
Prelude> :load hello
Ok, modules loaded: Main.
Prelude Main> main
What else can you do in here? Your basic infix arithmetic operators:
Prelude Main> 2 + 2
Function calls require no syntax at all:
Prelude Main> sqrt 10
Round brackets and commas give you tuples: functions fst (first) and snd (second)
work on two-element tuples:
Prelude Main> fst (1,2)
Prelude Main> snd (1,2)
Square brackets and commas give you lists, with : as the cons operator:
Prelude Main> 1 : [2,3,4]
The identifier it gives you the result of the previous operation:
Prelude Main> tail it
Prelude Main> head it
head is the CAR function and tail is the CDR. Strings are lists of characters:
Prelude Main> head "Hello"
Prelude Main> tail "Hello"
++ concatenated lists, including strings:
Prelude Main> 'H' : "ello"
Prelude Main> "H" ++ "ello"
You can try some functions on characters, if you first import the required library of character functions, so:
Prelude> import Data.Char
Prelude Data.Char> map toUpper "hello"
The notation [x..y] gives you a list of elements in the range from x to y.
We have the familiar list operations map, filter and foldr (fold-right):
Prelude Main> map sqrt [1..10]
Prelude Main> filter even [1..10]
Prelude Main> foldr (+) 0 [1..10]
The next most valuable REPL command is :t, which tells you the type of an expression.