2013-08-30 9 views
4

unfold/coiterControl.Comonad.Cofreeunfold/ana에서 Data.Control.Fixedpoint 사이의 차이점을 파악하려고합니다. Hackage 라이브러리가 있습니다. freerecursion-schemes.동축 코모도어의 전개 할 수없는 인스턴스

CofreeFix은 사촌 인 것처럼 보입니다. 나는 그 중 무엇이 가능하고 무엇이 가능한지 알아 내려고하고 있습니다.

나는 내가 unfold/coiter에서 얻은 무료 모나드에 cata을 적용 할 수 있습니다 Cofree에 대한 Foldable의 인스턴스를 작성할 수

:

type instance Base (Cofree f a) = f 

instance Functor f => Foldable (Cofree f a) where 
    project = unwrap 

하지만이 인스턴스를 만들 수 없습니다 :

instance Functor f => Unfoldable (Cofree f a) where 
    embed = xembed 

xembed :: Functor f => f (Cofree f a) -> Cofree f a 
xembed = undefined 

을 전혀 가능합니까?

답변

4

아니요, 일반적으로 Cofree에이 기능을 쓸 수 없습니다.

xembed :: Proxy (Cofree Proxy a) -> Cofree Proxy a 
-- i.e. 
xembed ::() -> a 

가 갑자기 밖으로 a를 얻을 수 있습니다 f ~ Proxy (data Proxy a = Proxy) 고려하십시오.

Free : wrap :: f (Free f a) -> Free f a에 대해 xembed을 쓸 수 있습니다. 그리고 마찬가지로 일반적으로 xproject :: Free f a -> f (Free f a)을 쓸 수 없습니다.

+0

무료 모나드에는'project'를 쓸 수없고, 무료 모나드에는'embed '을 쓸 수 없다는 것을 의미합니까? – nponeccop

+1

네, 저는 그것을 고쳤습니다. (그것은 자유로운 코모 나드가 아니라 자유로운 코모 나드입니다! :-)). 그러나 이제는이 클래스들이 실제로 무엇인지 살펴 보았습니다. 아마도 '기본'타입은 당신이 원하는 것이 아닙니다 (나는 당신이 그곳에서 무엇을하고 있는지 확실히 모릅니다). ''Freef''는'\ self -> (f self)의 고정 소수점이며'Free fa'는'f self '의 고정 소수점입니다. . – shachaf