Guest User

Untitled

a guest
Nov 23rd, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. cata f = c where c = f . fmap c . project
  2. {- c = cata f -}
  3. = f . fmap (cata f) . project
  4.  
  5. prepro e f = c where c = f . fmap (c . cata (embed . e)) . project
  6. {- c = prepro e f -}
  7. = f . fmap (prepro e f . cata (embed . e)) . project
  8.  
  9. #!/usr/bin/env stack
  10. -- stack --resolver lts-9.14 script
  11. {-# LANGUAGE TypeFamilies, DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
  12. import Data.Functor.Foldable -- package recursion-schemes
  13. import Data.Tree -- package containers
  14. -- Tree a = Rose trees of a
  15. -- The TH recursion-schemes has breaks down on it, so...
  16. data TreeF a r = NodeF { rootLabelF :: a, subForestF :: [r] }
  17. deriving (Functor, Foldable, Traversable)
  18. type instance Base (Tree a) = TreeF a
  19. instance Recursive (Tree a) where project (Node a ts) = NodeF a ts
  20. instance Corecursive (Tree a) where embed (NodeF a ts) = Node a ts
  21.  
  22. tree :: Tree Integer
  23. tree = Node 2 [Node 1 [Node 3 []], Node 7 [Node 1 [], Node 5 []]]
  24.  
  25. main = do -- Original
  26. drawTree' tree
  27.  
  28. -- 0th layer: *1
  29. -- 1st layer: *2
  30. -- 2nd layer: *4
  31. -- ...
  32. drawTree' $ prepro ((NodeF x y) -> NodeF (x*2) y) embed tree
  33.  
  34. -- Same thing but a different algebra
  35. -- "sum with deeper values weighted more"
  36. print $ prepro ((NodeF x y) -> NodeF (x*2) y) ((+) <$> sum <*> rootLabelF) tree
  37. where drawTree' = putStr . drawTree . fmap show
Add Comment
Please, Sign In to add comment