data BinTree a = BNode (BinTree a) a (BinTree a) | BEmpty deriving ( Eq, Show, Read ) data Direction = L | R deriving ( Eq, Ord, Show, Read ) modify :: BinTree a -> [Direction] -> a -> BinTree a modify = undefined data TreeDir a = TLeft a (BinTree a) | TRight (BinTree a) a deriving ( Eq, Show, Read ) data TreeZipper a = TZip [TreeDir a] (BinTree a) deriving ( Eq, Show, Read ) toZipper :: BinTree a -> TreeZipper a toZipper tree = TZip [] tree fromZipper :: TreeZipper a -> BinTree a fromZipper (TZip [] tree) = tree fromZipper (TZip (TLeft v r : ds) tree) = fromZipper $ TZip ds (BNode tree v r) fromZipper (TZip (TRight l v : ds) tree) = fromZipper $ TZip ds (BNode l v tree)