2017-02-15 8 views
6

목록에 비어 있지 않은 구조를 펼쳐 것은 anamorphism를 사용하여 나무 장미,하지만 마지막 요소를 추출하는 것은 불가능 보인다 실제로 불가능은'비 비어에 대한 <code>Foldable.toList</code>을 기록 할

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를 사용할 수없는 경우를 결정하는 일반적인 규칙은 무엇입니까 (선택 사항 보너스 질문의 한 종류입니까?).

Btw는 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로 구성되어, anamorphism 아니야.

당신은 물론, ana의 측면에서 apo을 구현할 수 있습니다

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))

을 당신은 할 수 있습니다 너의 coalg6을 이것에 연결하고 똑같은 일을하는 coalgebra를 ana :

ana5 = ana coalg5 . Right 
    where coalg5 = either (fmap Left . unFix) coalg6