Download Slides

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Cse536 Functional Programming
Lecture #7, Oct. 18, 2004
•Today’s Topics
– Trees
– Kinds of trees - branching factor
–functions over trees
–patterns of recursion - the fold for trees
–Arithmetic expressions
–Infinite trees
•Reading Assignment
– Finish: Chapter 6 - Shapes III; Perimeters of Shapes
–Finish: Chapter 7 - Trees
- Start (for next time)
Chapter 8 - A Module of Regions
Chapter 9 - More About Higher Order Functions
5/24/2017
1
Cse536 Functional Programming
Trees
• Trees are important data structures in computer
science
• Trees have interesting properties
–
–
–
–
–
They usually are finite, but unbounded in size
Sometimes contain other types inside
Sometimes the things contained are polymorphic
differing “branching factors”
different kinds of leaf and branching nodes
• Lots of interesting things can be modeled by trees
– lists (linear branching)
– arithmetic expressions
– parse trees (for languages)
• In a lazy language it is possible to have infinite trees
5/24/2017
2
Cse536 Functional Programming
Examples
data List a = Nil | MkList a (List a)
data Tree a = Leaf a | Branch
(Tree a) (Tree a)
data IntegerTree = IntLeaf Integer
| IntBranch IntegerTree IntegerTree
data SimpleTree
= SLeaf
| SBranch SimpleTree SimpleTree
data InternalTree a = ILeaf
| IBranch a (InternalTree a)
(InternalTree a)
data FancyTree a b = FLeaf a
| FBranch b (FancyTree a b)
(FancyTree a b)
5/24/2017
3
Cse536 Functional Programming
Match up the trees
• IntegerTree
A
A
B
• Tree
B
i
• SimpleTree
j
A
k
B
C
• List
• InternalTree
A
2
• FancyTree
5/24/2017
B
6
9
4
Cse536 Functional Programming
Functions on Trees
• Transforming one kind of tree into another
mapTree :: (a->b) -> Tree a -> Tree b
mapTree f (Leaf x)
= Leaf (f x)
mapTree f (Branch t1 t2) = Branch (mapTree f t1)
(mapTree f t2)
• Collecting the items in a tree
fringe
:: Tree a -> [a]
fringe (Leaf x)
= [x]
fringe (Branch t1 t2) = fringe t1 ++ fringe t2
• what kind of information is lost using fringe?
5/24/2017
5
Cse536 Functional Programming
More functions
treeSize
:: Tree a -> Integer
treeSize (Leaf x)
= 1
treeSize (Branch t1 t2) = treeSize t1 + treeSize t2
treeHeight
:: Tree a -> Integer
treeHeight (Leaf x)
= 0
treeHeight (Branch t1 t2) = 1 + max (treeHeight t1)
(treeHeight t2)
5/24/2017
6
Cse536 Functional Programming
Capture the pattern of recursion
foldTree :: (a -> a -> a) -> (b -> a) -> Tree b -> a
foldTree b l (Leaf x)
= l x
foldTree b l (Branch t1 t2) = b (foldTree b l t1)
(foldTree b l t2)
mapTree2 f = foldTree Branch (Leaf . f)
fringe2 = foldTree (++) (\ x -> [x])
treeSize2 = foldTree (+) (const 1)
treeHeight2 = foldTree (\ x y -> 1 + max x y)
(const 0)
5/24/2017
7
Cse536 Functional Programming
Flattening Trees
data Tree a
= Leaf a | Branch
(Tree a) (Tree a)
flatten :: Tree a -> [a]
flatten (Leaf x) = [x]
flatten (Branch x y) – flatten x ++ flatten y
What is the complexity of flattening a deep fully
filled out tree?
5/24/2017
8
Cse536 Functional Programming
Flattening with accumulating parameter
data Tree a
= Leaf a | Branch
(Tree a) (Tree a)
flatten :: Tree a -> [a]
Flatten t = flat t []
flat (Leaf x) xs = x:xs
Flat (Branch a b) – flat a (flat b xs)
5/24/2017
9
Cse536 Functional Programming
Arithmetic Expressons
data Expr2 =
|
|
|
|
C2 Float
Add2 Expr2
Sub2 Expr2
Mul2 Expr2
Div2 Expr2
Expr2
Expr2
Expr2
Expr2
• using infix constructor functions
data Expr =
|
|
|
|
5/24/2017
C Float
Expr :+
Expr :Expr :*
Expr :/
Expr
Expr
Expr
Expr
Infix constructor operators start
with a colon (:) , just like
constructor functions start with
an upper case letter
10
Cse536 Functional Programming
Example uses
e1 = (C 10 :+ (C 8 :/ C 2)) :* (C 7 :- C 4)
evaluate
evaluate
evaluate
evaluate
evaluate
evaluate
:: Expr ->
(C x) = x
(e1 :+ e2)
(e1 :- e2)
(e1 :* e2)
(e1 :/ e2)
Float
=
=
=
=
evaluate
evaluate
evaluate
evaluate
e1
e1
e1
e1
+
*
/
evaluate
evaluate
evaluate
evaluate
e2
e2
e2
e2
Main> evaluate e1
42.0
5/24/2017
11
Cse536 Functional Programming
Infinite Trees
• Can we make an Expr tree that represents the
infinite expression: 1 + 2 + 3 + 4 ….
sumFromN n = C n :+ (sumFromN (n+1))
sumAll = sumFromN 1
add1
add1
add1
add1
add1
(C
(x
(x
(x
(x
n)
:+
::*
:/
= C (n+1)
y) = add1
y) = add1
y) = add1
y) = add1
x
x
x
x
:+
::*
:/
add1
add1
add1
add1
y
y
y
y
sumAll2 = C 1 :+ (add1 sumAll2)
5/24/2017
12
Cse536 Functional Programming
Observing Infinite Trees
• We can observe an infinite tree by printing a finite
prefix of it. We need a take-like function for trees.
showE 0 _ = "..."
showE n (C m) = show m
showE n (x :+ y) = "(" ++ (showE (n-1) x) ++ "+"
++ (showE (n-1) y) ++ ")"
Main> showE 5 sumAll2
"(1.0+(2.0+(3.0+(4.0+(...+...)))))"
Main> showE 5 sumAll
"(1.0+(2.0+(3.0+(4.0+(...+...)))))"
5/24/2017
13
Cse536 Functional Programming
The Region datatype
• A region represents an area on the two dimensional
plane
• Its represented by a tree-like data-structure
-- A Region is either:
data Region =
Shape Shape
| Translate Vector Region
| Scale
Vector Region
| Complement Region
| Region `Union` Region
| Region `Intersect` Region
| Empty
deriving Show
5/24/2017
-------
primitive shape
translated region
scaled region
inverse of region
union of regions
intersection of regions
14
Cse536 Functional Programming
Regions and Trees
• Why is Region tree-like?
• What’s the strategy for writing functions over
Regions?
• Is there a fold-function for Regions?
– How many parameters does it have?
– What is its type?
• Can one make infinite regions?
• What does a region mean?
5/24/2017
15
Related documents