4

我试图找出unfold/coiterfromControl.Comonad.Cofreeunfold/anafrom之间的区别Data.Control.Fixedpoint。黑客库分别是。freerecursion-schemes

Cofree似乎是堂兄弟,Fix我试图弄清楚两者都有什么可能,只有其中一个有什么可能。

Foldable我可以写一个for的实例,Cofree这样我就可以申请cata一个从以下位置获得的免费 monad unfold/coiter

type instance Base (Cofree f a) = f

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

但我无法构造一个Unfoldable实例:

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

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

有可能吗?

4

1 回答 1

4

不,您一般不能编写此函数Cofree。考虑f ~ Proxy(其中data Proxy a = Proxy):

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

必须得a从天而降。

但是,您可以写xembedFree: wrap :: f (Free f a) -> Free f a。同样,你不能写xproject :: Free f a -> f (Free f a)一般。

于 2013-08-31T01:36:46.487 回答