H. Conrad Cunningham
1 September 2018
Copyright (C) 2017, 2018, H. Conrad Cunningham
Acknowledgements: I created these slides in Fall 2018 to accompany Chapter 4, First Haskell Programs, of the book Exploring Languages with Interpreters and Functional Programming.
Browser Advisory: The HTML version of this document may require use of a browser that supports the display of MathML. A good choice as of August 2018 is a recent version of Firefox from Mozilla.
Examine syntax and semantics of Haskell functions using factorial examples
Explore how to execute functions using Haskell REPL
ghci
Factorial using product operator:
Factorial using recursive definition (or recurrence relation):
First line type signature of form object ::
type.
Type name begins with uppercase letter
Type fact1
is function
(->
)
Int
) argument,
returns integerNo builtin natural number type
Second line defining equation fname parms =
body
'
)Body expression if
condition then
expression1 else
expression2
Bool
) value,
either True
or False
True
False
Indentation is significant, indicates nesting
then
clause base case n == 0
else
clause
recursive case
fact1
to entire
expression (n-1)
– parenthesis0
Difference with mathematical definition?
Function application by listing argument expressions after function name
f
to argument
expressions x
and y
f x y
Conventional infix form for convenience (syntactic sugar)
add x y
written x + y
Function application higher precedence than others
f x + y
same
as (f x) + y
|
denotes guarded equation
True
Function fact2
equivalent
to fact1
Two equations, each with a different pattern in parameter list
0
in first
leg matches value 0n
in second matches
anythingFunctions fact1
, fact2
, and
fact3
equivalent
To stop “infinite loop”, remove negative integers from domain
Function fact4
undefined
for negatives – fails quickly
fact4' :: Int -> Int
fact4' n
| n == 0 = 1
| n >= 1 = n * fact4' (n-1)
| otherwise = error "fact4' called with negative argument"
Function fact4'
[1..n]
generates list of integers from 1
to n
, inclusive
Library function product
multiplies elements of list
What if apply fact5
to
negative?
[1..0]
generates empty listproduct
of
empty list is 1
– identity
for multiplicationfact5 (-1)
yields 1
Haskell factorial functions Factorial.hs
Haskell test script TestFactorial.hs
Discussed in Chapter 12 on software testing
See the Glasgow Haskell Compiler Users Guide
Start REPL
Load module Factorial
holding factorial function definitions – assumes file
Factorial.hs
in current directory – load
command abbreviated :l
Inquire about type of fact1
Apply function fact1
to
7, 0, 20, 1 – note 21 exceeds Int
range
Apply functions fact2
,
fact3
, fact4
, fact5
to 7
Apply functions fact1
,
fact2
, fact3
to -1 – infinite recursion –
eventually runtime stack overflow
Apply functions fact4
,
fact4'
to -1 – quickly
return with error
Apply function fact5
to
-1 – returns 1 because defined for negative integers
Set +s
option to get information about time and
space required – +t
option to get type of the returned
value
Exit GHCi
To edit source from within GHCi (using e.g. Aquamacs)
EDITOR
export EDITOR=Aquamacs
:set editor Aquamacs
:edit
command invokes editorHaskell has a syntax and semantics similar to mathematical notation
GHCI REPL enables interactive execution and exploration of Haskell functions
Haskell factorial functions Factorial.hs
Haskell test script TestFactorial.hs
Discussed in Chapter 12 on software testing