her.esy.fun/src/posts/0010-Haskell-Now/infinite_tree.hs

33 lines
1.2 KiB
Haskell
Raw Normal View History

2019-12-31 00:00:04 +00:00
import Data.Tree (Tree,Forest(..))
import qualified Data.Tree as Tree
2019-12-25 21:17:22 +00:00
2019-12-31 00:00:04 +00:00
data BinTree a = Empty
| Node a (BinTree a) (BinTree a)
deriving (Eq,Ord,Show)
2019-12-25 21:17:22 +00:00
2019-12-31 00:00:04 +00:00
-- | Function to transform our internal BinTree type to the
-- type of Tree declared in Data.Tree (from containers package)
-- so that the function Tree.drawForest can use
binTreeToForestString :: (Show a) => BinTree a -> Forest String
binTreeToForestString Empty = []
binTreeToForestString (Node x left right) =
[Tree.Node (show x) ((binTreeToForestString left) ++ (binTreeToForestString right))]
2019-12-25 21:17:22 +00:00
2019-12-31 00:00:04 +00:00
-- | Function that given a BinTree print a representation of it in the console
prettyPrintTree :: (Show a) => BinTree a -> IO ()
prettyPrintTree = putStrLn . Tree.drawForest . binTreeToForestString
2019-12-25 21:17:22 +00:00
nullTree = Node 0 nullTree nullTree
-- take all element of a BinTree
-- up to some depth
treeTakeDepth _ Empty = Empty
treeTakeDepth 0 _ = Empty
treeTakeDepth n (Node x left right) = let
nl = treeTakeDepth (n-1) left
nr = treeTakeDepth (n-1) right
in
Node x nl nr
main = prettyPrintTree (treeTakeDepth 4 nullTree)