6

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 gg-coalgebras ではなく f-algebras を使用していつ実装できるかを決定する一般的なルールはありますか?

ところで、アポモルフィズムは機能しました:

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

apo coalg6と同じ型ana5ですが、1 つの要素を失いません

4

1 に答える 1