2013-08-30 4 views
4

Я пытаюсь выяснить разницу между unfold/coiter от Control.Comonad.Cofree и unfold/ana от Data.Control.Fixedpoint. Библиотеки хакеров - соответственно. free и recursion-schemes.Развернутый экземпляр для cofree comonad

Cofree и Fix, кажется, родственники, и я пытаюсь выяснить, что возможно с обоими и тем, что возможно только с одним из них.

Я мог бы написать экземпляр Foldable для Cofree так что я могу применить cata к свободной монады, полученной из unfold/coiter:

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 в целом. Рассмотрим f ~ Proxy (где data Proxy a = Proxy):

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

Имеет получить a из ниоткуда.

Вместе с тем, вы можете написать xembed для Free: wrap :: f (Free f a) -> Free f a. И аналогичным образом вы не можете писать xproject :: Free f a -> f (Free f a) в целом.

+0

Вы имеете в виду, что я не могу написать 'project' бесплатно монады и' embed' бесплатно comonads? – nponeccop

+1

Да, я исправил это (это cofree comonad, а не бесплатный comonad! :-)). Однако теперь, когда я смотрел на то, что эти классы на самом деле, может быть, ваш тип «Base» просто не то, что вы хотите (я не совсем уверен, что вы после него). 'Cofree fa' является фиксированной точкой' \ self -> (a, f self) 'и' Free fa' является фиксированной точкой '\ self>> Либо (f self)', а не только 'f' , – shachaf

 Смежные вопросы

  • Нет связанных вопросов^_^