mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
92 lines
2.3 KiB
Elm
92 lines
2.3 KiB
Elm
|
|
{-----------------------------------------------------------------
|
|
|
|
Overview: A "Tree" represents a binary tree. A "Node" in a binary
|
|
tree always has two children. A tree can also be "Empty". Below
|
|
I have defined "Tree" and a number of useful functions.
|
|
|
|
This example also includes some challenge problems :)
|
|
|
|
-----------------------------------------------------------------}
|
|
|
|
|
|
data Tree a = Node a (Tree a) (Tree a) | Empty
|
|
|
|
empty = Empty
|
|
singleton v = Node v Empty Empty
|
|
|
|
insert x tree =
|
|
case tree of
|
|
Empty -> singleton x
|
|
Node y left right ->
|
|
if x == y then tree else
|
|
if x < y then Node y (insert x left) right
|
|
else Node y left (insert x right)
|
|
|
|
fromList xs = foldl insert empty xs
|
|
|
|
depth tree =
|
|
case tree of
|
|
Node v left right -> 1 + max (depth left) (depth right)
|
|
Empty -> 0
|
|
|
|
map f tree =
|
|
case tree of
|
|
Node v left right -> Node (f v) (map f left) (map f right)
|
|
Empty -> Empty
|
|
|
|
t1 = fromList [1,2,3]
|
|
t2 = fromList [2,1,3]
|
|
|
|
main = flow down [ display "depth" depth t1
|
|
, display "depth" depth t2
|
|
, display "map ((+)1)" (map ((+)1)) t2
|
|
]
|
|
|
|
display name f v =
|
|
text . monospace . toText $
|
|
concat [ show (f v), " ⇐ ", name, " ", show v ]
|
|
|
|
{-----------------------------------------------------------------
|
|
|
|
Exercises:
|
|
|
|
(1) Sum all of the elements of a tree.
|
|
|
|
sum :: Tree Number -> Number
|
|
|
|
(2) Flatten a tree into a list.
|
|
|
|
flatten :: Tree a -> [a]
|
|
|
|
(3) Check to see if an element is in a given tree.
|
|
|
|
isElement :: a -> Tree a -> Bool
|
|
|
|
(4) Write a general fold function that acts on trees. The fold
|
|
function does not need to guarantee a particular order of
|
|
traversal.
|
|
|
|
fold :: (a -> b -> b) -> b -> Tree a -> b
|
|
|
|
(5) Use "fold" to do exercises 1-3 in one line each. The best
|
|
readable versions I have come up have the following length
|
|
in characters including spaces and function name:
|
|
sum: 16
|
|
flatten: 21
|
|
isElement: 46
|
|
See if you can match or beat me! Don't forget about currying
|
|
and partial application!
|
|
|
|
(6) Can "fold" be used to implement "map" or "depth"?
|
|
|
|
(7) Try experimenting with different ways to traverse a
|
|
tree: pre-order, in-order, post-order, depth-first, etc.
|
|
More info at: http://en.wikipedia.org/wiki/Tree_traversal
|
|
|
|
-----------------------------------------------------------------}
|
|
|
|
|
|
|
|
|