一次展開一層結構

Anamorphisms ,或展開,模型原始的 corecursion。ana 逐層構建一個固定點,使用餘代數函式(或展開函式 )生成每個新圖層。ana 需要 Functor 例項作為模板型別 f

ana::Functor f => (a -> f a) -> a -> Fix f
ana f = Fix . fmap (ana f) . f

-- list example
unfoldr :: (b -> Maybe (a, b)) -> b -> List a
unfoldr f = ana coalg
    where coalg x = case f x of
                         Nothing -> Nil_
                         Just (x, y) -> Cons_ x y

請注意,anacata雙重的。型別和實現是彼此的映象。