2017-02-15 3 views
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 gはf-algebrasでは実装できますが、g-coalgebrasでは実装できない場合は、一般的なルールがありますか?

はところで働いapomorphism:

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

apo coalg6ana5と同じ型を持っていますが、あなたはあなた自身の質問に答えてきた一つの要素

答えて

2

失うことはありません。この操作は、当然apomorphismとして構成されているが、アナモフィックではありません。

apo :: Functor f => (a -> f (Either (Fix f) a)) -> a -> Fix f 
apo f = ana (either (fmap Left . unFix) f) . Right 

(私は "cataの面でparaを" dualisingことで、この思い付いた::。para f = snd . cata (Fix . fmap fst &&& f)

することができますちょうどあなたが、当然のことながら、anaの面でapoを実装することができます

あなたのcoalg6をこれに差し込み、同じことをすると同義語を得るana

ana5 = ana coalg5 . Right 
    where coalg5 = either (fmap Left . unFix) coalg6 
関連する問題