Module 01: Introduction to Haskell
List the names of your team members.
List any general citations here. Specific citations can be placed inline. Remember that every module turned in must give credit to at least two sources!
In this module you will focus on learning some of the basics of the Haskell programming language. If you already know some Haskell, you should focus on helping your partner(s) understand all the material in this module. However, keep in mind that people learn best by doing, not by being told. The driver should be whoever has the least experience with Haskell.
This file is a “literate Haskell document”: only lines preceded by > and a space (see below) are code; everything else (like this paragraph) is a comment, formatted using Markdown syntax. Literate Haskell documents have an extension of .lhs
, whereas non-literate Haskell source files use .hs
.
GHCi
Run
ghci
from a command prompt. At the resultingghci
prompt, type:help
.Find the command to exit
ghci
. What is it? Exitghci
now.Using the
cd
command at the shell prompt, change to the directory containing this file,01-Haskell.lhs
.Now start
ghci
again. Find the command to load a module. What is it? Load this file,01-Haskell.lhs
, intoghci
. Note that by default,ghci
will look for files in the same directory in which it was started.
Hint: to kill a runaway ghci
evaluation, use Ctrl+C.
Basic Haskell declarations
Now consider the following Haskell code.
> i :: Int
> i = -35
>
> n :: Integer
> n = 25
>
> c :: Char
> c = 'Z'
>
> b :: Bool
> b = True
>
> s :: String
> s = "Hello, world!"
>
> f :: Integer -> Integer
> f n = 2*n + 1
>
> g :: Integer -> Integer -> Integer
> g m n = (m - n)*(m + n)
>
> -- This is a comment
> {- So
> is
> this -}
>
> -- Uncomment me:
> -- i = 12
Enter
:type n
at theghci
prompt. What does the:type
command do?What do you think
::
means?What do you think
=
means?What do you think
->
means?Find the
ghci
command to reload the current module. Uncomment the linei = 12
above, save this file, and reload. What happens? Does it change your answer to the previous question at all?
Arithmetic
At the
ghci
prompt, type each of the following expressions, and record the result. Feel free to experiment with other expressions as well.3 + 2 19 - 27 div 19 3 19 `div` 3 mod 19 3 19 `mod` 3 19 `divMod` 3 7 ^ 222 (-3) * (-7) 2*i + 3 i + n
Explain what happens when you evaluate
i + n
.What are the smallest and largest possible
Int
values?What are the smallest and largest possible
Integer
values?
(Haskell has floating-point values too, but we won’t use them much in this course.)
Booleans
Find out the syntax for each of the following operations in Haskell:
Boolean operations: and, or, not
Comparison: equal, not equal, less than, greater than, less or equal, greater or equal
if-expressions
Of course, be sure to cite any resources you use!
- Play around with the operators you discovered and try them on a bunch of examples. Record three of your most interesting experiments, the result, and what you learned from each.
Pairs
Type
(n,c)
at theghci
prompt. What is the result?What is the type of
(n,c)
?What is the result of
fst (n,c)
?What is the result of
snd (n,c)
?What is the type of
fst
? What does it do?
Values like (n,c)
are called pairs, or more generally, tuples. (Haskell also has 3-tuples, 4-tuples, … but we will not use them.)
- Write an expression
E
such thatfst (fst (snd (fst E))) == 6
.
Functions
Evaluate the following expressions:
f 6
f 8
g 5 4
g 2 3
A function takes one or more input values and produces a single output value.
What is the Haskell syntax for applying a function to a single argument?
What is the Haskell syntax for applying a function to multiple arguments?
Write a function which takes two
Integer
values as input and returnsTrue
if and only if the first is greater than twice the second. What is the type of your function?
Pattern matching
> wub :: Integer -> Integer
> wub 0 = 1
> wub n = n * wub (n-1)
>
> dub :: Integer -> Integer
> dub 0 = 0
> dub 1 = 1
> dub n = dub (n-1) + dub (n-2)
>
> flub :: (Integer, Integer) -> Integer
> flub p = fst p + 2 * snd p
>
> gub :: (Integer, Integer) -> Integer
> gub (x,y) = x + 2*y
Evaluate
wub 0
,wub 1
, andwub 5
.Explain in words what
wub
does.What does the line
wub 0 = 1
mean?What do you think would happen if the lines
wub 0 = 1
andwub n = n * wub (n-1)
were switched? Make a guess before trying it, and record your guess here.Now try it. What happens? Why?
What happens when you evaluate
wub (-3)
? Why?Evaluate
wub (3+1)
andwub 3+1
. Can you explain the difference?What does
dub
do?What happens if the lines
dub 0 = 0
anddub 1 = 1
are switched?Call
flub
andgub
on some example inputs. Record your results here. Do you notice a difference between the behavior offlub
andgub
?Explain the difference between
flub
andgub
.Which do you prefer? Why?
Guards
> hailstone :: Integer -> Integer
> hailstone n
> | even n = n `div` 2
> | otherwise = 3*n + 1
Try evaluating
hailstone
on some example inputs; record them here.Try evaluating
even
on some example inputs. What doeseven
do?How is
otherwise
defined?Explain the behavior of
hailstone
.