D16/B330/3C11 Functional Programming Lecture 5

Download Report

Transcript D16/B330/3C11 Functional Programming Lecture 5

GC16/3011 Functional Programming
Lecture 5
Miranda
patterns, functions, recursion and lists
4/10/2016
1
Contents





Offside rule / where blocks / evaluation
Partial / polymorphic functions
Patterns and pattern-matching
Recursive functions
Lists
 Functions using lists
 Recursive functions using lists
4/10/2016
2
Functions

The offside rule and “where” blocks

Mapping from source to target type domains

Application associates to the left!

Function evaluation
 normal order, lazy
 main = fst (34, (23 / 0) )
4/10/2016
3
Functions

Partial functions
 those which have no result (i.e. return an error) for
some valid values of valid input type
 f (x,y) = x / y

Polymorphic functions
 fst, snd
 g (x,y) = (-y, x)
 three x = 3
4/10/2016
4
Patterns

Tuple patterns
 (x,y,z) = (3, “hello”, (34,True,[3]))



as a test
as a definition
Patterns for function definitions
not True = False
not False = True

Top-down evaluation semantics
f
3 = 45
f 489 = 3
f any = 345*219
4/10/2016
5
Patterns

Non-exhaustive patterns
f True = False

Patterns can destroy laziness
fst (x,0) = x
fst (x,y) = x

Can a pattern contain a redex?



No! A pattern must be a constant expression
(special exception – “(n + 1)” in Miranda)
Duplicate parameter names (Miranda only)
4/10/2016
6
Recursive Functions

Recursion is the ONLY way to program loops in a
functional language
 Function calls itself inside its own body

Very powerful – very flexible

In imperative languages, can be slow

In functional languages, highly optimised
4/10/2016
7
Recursive Functions

Beware:
loop_forever x = loop_forever x

Must have:
 Terminating condition
 Changing argument
 …that converges on the terminating condition!
f :: num -> [char]
f 0 = “”
f n = “X” ++ (f (n – 1))
4/10/2016
8
Recursive Functions

Stack recursion










f 3
 “X” ++ (f (3 – 1))
 “X” ++ (f 2)
 “X” ++ (“X” ++ (f (2-1)))
 “X” ++ (“X” ++ (f 1))
 “X” ++ (“X” ++ (“X” ++ (f (1-1))))
 “X” ++ (“X” ++ (“X” ++ “”))
 “X” ++ (“X” ++ “X”)
 “X” ++ “XX”
 “XXX”
4/10/2016
9
Recursive Functions

Accumulative recursion
plus :: (num, num) -> num
plus (x, 0) = x
plus (x, y) = plus (x+1, y-1)
4/10/2016
10
Type Synonyms

f :: (([char],num,[char]),(num,num,num)) -> bool


str = = [char]
coord = = (num, num, num)

f :: ((str,num,str), coord) -> bool
4/10/2016
11
LISTS



Lists are another way to collect together
related data
But lists are special - they are RECURSIVE
Data can be recursive, just like functions!
4/10/2016
12
LISTS

A list of type a is either:
 Empty, or
 An element of type a together with a list of
elements of the same type

List of num:
 []
 (34: [])
 (34: (13: []))
[34]
[34, 13]
4/10/2016
13
Functions using lists
bothempty :: ([*],[**]) -> bool
bothempty ([], []) = True
bothempty anything = False
myhd :: [*] -> *
myhd [] = error “take head of empty list”
myhd (x : rest) = x
4/10/2016
14
Recursive functions using lists
sumlist :: [num] -> num
sumlist [] = 0
sumlist (x : rest) = x + (sumlist rest)
length :: [*] -> num
length [] = 0
length (x : rest) = 1 + (length rest)
4/10/2016
15
Exercise

Can you write a function “threes” which
takes as input a list of whole numbers and
produces as output a count of how many 3s
occur in the input?
4/10/2016
16
Summary





Offside rule / where blocks / evaluation
Partial / polymorphic functions
Patterns and pattern-matching
Recursive functions
Lists
 Functions using lists
 Recursive functions using lists
4/10/2016
17