我试图找出unfold/coiter
中的Control.Comonad.Cofree
和unfold/ana
中的Data.Control.Fixedpoint
之间的区别。黑客库是各自的。 free
和recursion-schemes
。Cofree
和Fix
似乎是表亲,并且我想弄清楚这两者都有可能,只有其中之一有可能。
我可以为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
。但是,您可以为
xembed
:Free
编写wrap :: f (Free f a) -> Free f a
。同样,您通常不能编写xproject :: Free f a -> f (Free f a)
。