一次展开一层结构

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双重的。类型和实现是彼此的镜像。