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
 | |
| 
 | |
| -----------------------------------------------------------------}
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |