3 ms·
Reginald is definitely hinting at hylomorphisms here. I'd be curious to see if stream fusion could be achieved in JS for a hylomorphism.
by dukerutledge 10y ago
Reginald is definitely hinting at hylomorphisms here. I'd be curious to see if stream fusion could be achieved in JS for a hylomorphism.
- braythwayt 10y agoIsn’t `multirec` a function for making hylomorphisms? The recursive dividing is the anamorphism, and the combining of the results is the catamorphism. As written, however, `multirec` does not efficiently compose. For two constructions to be compatible, they’d have to share their decomposition strategy, including `indivisible` and `divide`. `value` probably composes neatly, but `combine` is a little thorny as the current implementation does two jobs: Processing the data and reconstructing the form of the data. A composable `multirec` does sound interesting, however. Hmmm...
- jaredtobin 10y agoIt's exactly a hylomorphism. Here's a possibly more familiar-looking Haskell form: {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE LambdaCase #-} import Data.Functor.Foldable import Data.List.Split data QuadTreeF a r = NodeF r r r r | LeafF a | EmptyF deriving Functor builder :: [a] -> QuadTreeF a [a] builder = \case [] -> EmptyF [x] -> LeafF x xs -> NodeF a b c d where [a, b, c, d] = chunksOf (length xs `div` 4) xs consumer :: QuadTreeF a [a] -> [a] consumer = \case EmptyF -> [] LeafF a -> [a] NodeF ul ur lr ll -> concat [ll, ul, ur, lr] rotate :: [a] -> [a] rotate = hylo consumer builder