我想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)
这确实是不可能的吗?它是否可以推广到所有非空结构?
另外(这是一个可选的奖励问题)是否有一个通用规则来确定何时Fix f -> Fix g
可以使用 f 代数而不是 g 代数来实现?
顺便说一句,同构起作用了:
coalg6 (RoseNode a []) = Cons a $ Left []
coalg6 (RoseNode a (RoseNode b1 b2:t)) = Cons a $ Right $ RoseNode b1 (b2 ++ t)
apo coalg6
具有相同类型ana5
但不丢失一个元素