import Control.Monad.Statedata Tree a = Empty | Node (Tree a) a (Tree a)testTree : Tree StringtestTree = Node (Node (Node Empty "Jim" Empty) "Fred" (Node Empty "Sheila" Empty)) "Alice" (Node Empty "Bob" (Node Empty "Eve" Empty))flatten : Tree a -> List aflatten Empty = []flatten (Node left val right) = flatten left ++ val :: flatten righttreeLabelWith : Tree a -> State (Stream labelType) (Tree (labelType, a))treeLabelWith Empty = pure EmptytreeLabelWith (Node left val right) = do left_labelled <- treeLabelWith left (this :: rest) <- get put rest right_labelled <- treeLabelWith right pure (Node left_labelled (this, val) right_labelled)treeLabel : Tree a -> Tree (Integer, a)treeLabel tree = evalState (treeLabelWith tree) [1..]
import Control.Monad.State
data Tree a = Empty
| Node (Tree a) a (Tree a)
testTree : Tree String
testTree = Node (Node (Node Empty "Jim" Empty) "Fred"
(Node Empty "Sheila" Empty)) "Alice"
(Node Empty "Bob" (Node Empty "Eve" Empty))
flatten : Tree a -> List a
flatten Empty = []
flatten (Node left val right) = flatten left ++ val :: flatten right
treeLabelWith : Tree a -> State (Stream labelType) (Tree (labelType, a))
treeLabelWith Empty = pure Empty
treeLabelWith (Node left val right)
= do left_labelled <- treeLabelWith left
(this :: rest) <- get
put rest
right_labelled <- treeLabelWith right
pure (Node left_labelled (this, val) right_labelled)
treeLabel : Tree a -> Tree (Integer, a)
treeLabel tree = evalState (treeLabelWith tree) [1..]