A Second Look At ML
Chapter Seven Modern Programming Languages, 2nd ed. 1
A Second Look At ML Chapter Seven Modern Programming Languages, 2nd - - PowerPoint PPT Presentation
A Second Look At ML Chapter Seven Modern Programming Languages, 2nd ed. 1 Outline Patterns Local variable definitions A sorting example Chapter Seven Modern Programming Languages, 2nd ed. 2 Two Patterns You Already Know We
Chapter Seven Modern Programming Languages, 2nd ed. 1
Chapter Seven Modern Programming Languages, 2nd ed. 2
Chapter Seven Modern Programming Languages, 2nd ed. 3
Chapter Seven Modern Programming Languages, 2nd ed. 4
val f = fn : 'a -> string
val it = "yes" : string
val it = "yes" : string
Chapter Seven Modern Programming Languages, 2nd ed. 5
Warning: match nonexhaustive 0 => ... val f = fn : int -> string
val it = "yes" : string
Chapter Seven Modern Programming Languages, 2nd ed. 6
val it = "yes" : string
uncaught exception nonexhaustive match failure
Chapter Seven Modern Programming Languages, 2nd ed. 7
Warning: match nonexhaustive a :: _ :: nil => ... val f = fn : 'a list -> 'a
val it = #"f" : char
Chapter Seven Modern Programming Languages, 2nd ed. 8
A variable is a pattern that matches anything, and binds to it A _ is a pattern that matches anything A constant (of an equality type) is a pattern that matches
A tuple of patterns is a pattern that matches any tuple of the
A list of patterns is a pattern that matches any list of the
A cons (::) of patterns is a pattern that matches any non-
Chapter Seven Modern Programming Languages, 2nd ed. 9
Chapter Seven Modern Programming Languages, 2nd ed. 10
Chapter Seven Modern Programming Languages, 2nd ed. 11
Chapter Seven Modern Programming Languages, 2nd ed. 12
Chapter Seven Modern Programming Languages, 2nd ed. 13
Chapter Seven Modern Programming Languages, 2nd ed. 14
Chapter Seven Modern Programming Languages, 2nd ed. 15
Chapter Seven Modern Programming Languages, 2nd ed. 16
Chapter Seven Modern Programming Languages, 2nd ed. 17
Chapter Seven Modern Programming Languages, 2nd ed. 18
Chapter Seven Modern Programming Languages, 2nd ed. 19
Chapter Seven Modern Programming Languages, 2nd ed. 20
Chapter Seven Modern Programming Languages, 2nd ed. 21
Chapter Seven Modern Programming Languages, 2nd ed. 22
Chapter Seven Modern Programming Languages, 2nd ed. 23
val it = 3 : int;
Error: unbound variable or constructor: x
Chapter Seven Modern Programming Languages, 2nd ed. 24
Chapter Seven Modern Programming Languages, 2nd ed. 25
Chapter Seven Modern Programming Languages, 2nd ed. 26
Chapter Seven Modern Programming Languages, 2nd ed. 27
Chapter Seven Modern Programming Languages, 2nd ed. 28
= | halve [a] = ([a], nil) = | halve (a::b::cs) = = let = val (x, y) = halve cs = in = (a::x, b::y) = end; val halve = fn : 'a list -> 'a list * 'a list
val it = ([1],[]) : int list * int list
val it = ([1],[2]) : int list * int list
val it = ([1,3,5],[2,4,6]) : int list * int list
Chapter Seven Modern Programming Languages, 2nd ed. 29
Chapter Seven Modern Programming Languages, 2nd ed. 30
Chapter Seven Modern Programming Languages, 2nd ed. 31
Chapter Seven Modern Programming Languages, 2nd ed. 32
= | merge (xs, nil) = xs = | merge (x::xs, y::ys) = = if (x < y) then x :: merge(xs, y::ys) = else y :: merge(x::xs, ys); val merge = fn : int list * int list -> int list
val it = [1,2,3] : int list
val it = [1,2,3,3,4,5,6,7,8,10] : int list
Chapter Seven Modern Programming Languages, 2nd ed. 33
Chapter Seven Modern Programming Languages, 2nd ed. 34
You can define local functions, just like local
You should do it for helper functions that you
We can hide halve and merge from the rest of
Another potential advantage: inner function can
Chapter Seven Modern Programming Languages, 2nd ed. 35
Chapter Seven Modern Programming Languages, 2nd ed. 36
(* Sort a list of integers. *) fun mergeSort nil = nil | mergeSort [e] = [e] | mergeSort theList = let (* From the given list make a pair of lists * (x,y), where half the elements of the * original are in x and half are in y. *) fun halve nil = (nil, nil) | halve [a] = ([a], nil) | halve (a::b::cs) = let val (x, y) = halve cs in (a::x, b::y) end;
Chapter Seven Modern Programming Languages, 2nd ed. 37
(* Merge two sorted lists of integers into * a single sorted list. *) fun merge (nil, ys) = ys | merge (xs, nil) = xs | merge (x::xs, y::ys) = if (x < y) then x :: merge(xs, y::ys) else y :: merge(x::xs, ys); val (x, y) = halve theList in merge(mergeSort x, mergeSort y) end;
– what parameters does it expect – what function does it compute – how does it do it (if non-obvious) – etc.
Chapter Seven Modern Programming Languages, 2nd ed. 38