一次展开一层结构
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
请注意,ana
和 cata
是双重的。类型和实现是彼此的镜像。