--
import Shape
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)
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
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)
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)
-------- Arithmetic Expressions
data Expr2 = C2 Float
| Add2 Expr2 Expr2
| Sub2 Expr2 Expr2
| Mul2 Expr2 Expr2
| Div2 Expr2 Expr2
data Expr = C Float
| Expr :+ Expr
| Expr :- Expr
| Expr :* Expr
| Expr :/ Expr
e1 = (C 10 :+ (C 8 :/ C 2)) :* (C 7 :- C 4)
evaluate :: Expr -> Float
evaluate (C x) = x
evaluate (e1 :+ e2) = evaluate e1 + evaluate e2
evaluate (e1 :- e2) = evaluate e1 - evaluate e2
evaluate (e1 :* e2) = evaluate e1 * evaluate e2
evaluate (e1 :/ e2) = evaluate e1 / evaluate e2
--- Inifinite trees
sumFromN n = C n :+ (sumFromN (n+1))
sumAll = sumFromN 1
add1 (C n) = C (n+1)
add1 (x :+ y) = add1 x :+ add1 y
add1 (x :- y) = add1 x :- add1 y
add1 (x :* y) = add1 x :* add1 y
add1 (x :/ y) = add1 x :/ add1 y
sumAll2 = C 1 :+ (add1 sumAll2)
showE 0 _ = "..."
showE n (C m) = show m
showE n (x :+ y) = "(" ++ (showE (n-1) x) ++ "+"
++ (showE (n-1) y) ++ ")"
--- Regions
-- A Region is either:
data Region =
Shape Shape -- primitive shape
| Translate Vector Region -- translated region
| Scale Vector Region -- scaled region
| Complement Region -- inverse of region
| Region `Union` Region -- union of regions
| Region `Intersect` Region -- intersection of regions
| Empty
deriving Show
type Vector = (Float, Float)
--