Skip to content

Instantly share code, notes, and snippets.

@m1el
Created July 14, 2014 10:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save m1el/469dea048c1b45e73a97 to your computer and use it in GitHub Desktop.
Save m1el/469dea048c1b45e73a97 to your computer and use it in GitHub Desktop.
playing with trees
data Tree a = Node a (Tree a) (Tree a) | Nil
deriving Show
treeDown :: (Tree a -> Tree a -> a) -> [a] -> Int -> (Tree a, [a])
treeDown fn [] _ = (Nil, [])
treeDown fn (x:xs) 0 = (Node x Nil Nil, xs)
treeDown fn xs n =
let (left, xs') = treeDown fn xs (n - 1)
(right, rem) = treeDown fn xs' (n - 1)
in (Node (fn left right) left right, rem)
treeUp :: (Tree a -> Tree a -> a) -> [a] -> Int -> Tree a -> Tree a
treeUp fn [] n left = left
treeUp fn (x:xs) 0 left =
treeUp fn xs 1 (Node x Nil Nil)
treeUp fn xs n left =
let (right, rem) = treeDown fn xs (n - 1)
up = Node (fn left right) left right
in treeUp fn rem (n + 1) up
treeFromList :: (Tree a -> Tree a -> a) -> [a] -> Tree a
treeFromList fn xs = treeUp fn xs 0 Nil
getVal :: Tree a -> a -> a
getVal Nil def = def
getVal (Node x _ _) def = x
main =
let add left right = getVal left 0 + getVal right 0
in print $ treeFromList add [1,2,3,4,5,6,7,8]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment