将非空结构展开到列表

时间:2017-02-15 04:32:55

标签: haskell recursion-schemes corecursion

我想使用变形法为非空玫瑰树写Foldable.toList,但似乎无法提取最后一个元素:

import Data.Functor.Foldable

data RoseTree a = RoseNode a [RoseTree a]

ana5 :: RoseTree a -> [a]
ana5 = ana coalg5

coalg5 :: RoseTree a -> ListF a (RoseTree a)
coalg5 (RoseNode a []) = Nil
coalg5 (RoseNode a (RoseNode b1 b2:t)) = Cons a $ RoseNode b1 (b2 ++ t)

这确实是不可能的,它是否适用于所有非空结构?

另外(它是一种可选的红利问题)是否有一个通用规则来确定何时可以使用f-algebras而不是g-coalgebras实现Fix f -> Fix g

Btw apomorphism有效:

coalg6 (RoseNode a []) = Cons a $ Left []
coalg6 (RoseNode a (RoseNode b1 b2:t)) = Cons a $ Right $ RoseNode b1 (b2 ++ t)

apo coalg6ana5的类型相同,但不会丢失一个元素

1 个答案:

答案 0 :(得分:2)

你已经回答了自己的问题:这个操作自然地构成了一个同态,而不是一个变形。

当然,您可以Sheets(1).Range(perNum & 2).FormulaR1C1 = "=VLOOKUP(RC[-22],Temp!C[-30]:C[-29],2,0)"

来实施apo
ana

(我在apo :: Functor f => (a -> f (Either (Fix f) a)) -> a -> Fix f apo f = ana (either (fmap Left . unFix) f) . Right ":para方面通过二元化" cata提出了这一点。)

你可以将你的para f = snd . cata (Fix . fmap fst &&& f)插入其中并获得一个代数coalg6时做同样事情的代数:

ana