我想使用变形法为非空玫瑰树写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
?
coalg6 (RoseNode a []) = Cons a $ Left []
coalg6 (RoseNode a (RoseNode b1 b2:t)) = Cons a $ Right $ RoseNode b1 (b2 ++ t)
apo coalg6
与ana5
的类型相同,但不会丢失一个元素
答案 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