我试图找出unfold/coiter中的Control.Comonad.Cofreeunfold/ana中的Data.Control.Fixedpoint之间的区别。黑客库是各自的。 freerecursion-schemes

CofreeFix似乎是表亲,并且我想弄清楚这两者都有可能,只有其中之一有可能。

我可以为Foldable编写Cofree的实例,以便可以将cata应用于从unfold/coiter获得的免费monad:

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


有可能吗?

最佳答案

不,您通常不能为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)

09-29 21:48