原始遞迴

Paramorphisms 模型原始遞迴。在摺疊的每次迭代中,摺疊函式接收子樹以供進一步處理。

para::Functor f => (f (Fix f, a) -> a) -> Fix f -> a
para f = f . fmap (\x -> (x, para f x)) . unFix

Prelude 的 tails 可以被建模為一個 paramorphism。

tails::List a -> List (List a)
tails = para alg
    where alg Nil_ = cons nil nil  -- [[]]
          alg (Cons_ x (xs, xss)) = cons (cons x xs) xss  -- (x:xs):xss