一次展開一層結構
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 是雙重的。型別和實現是彼此的映象。