这让我很难过.你是如何编写Functor实例的?newtype Mu f = InF {outF :: f (Mu f)}
你不能.为了Functor c为某些人定义一个实例c,c必须是那种* -> *.所以在你的情况下,Mu应该是那种,这意味着它的论点f必须是那种*.但显然事实并非如此,因为你正在应用f其他东西(to Mu f).
更简单地说,如果Mu是一个仿函数,你可以使用任何fmap类型的值.但这可以让你将类型参数更改为任何其他类型,例如,通过将函数应用于任何值,它将必须返回一个值.但是你不能形成这样的值,因为该值的类型没有意义.Mu fffmap (const (0 :: Int))Mu fMu IntoutFInt (Mu Int)
redneb 很好地解释了为什么Mu不能是常规的,但您可以为asFunctor实现一种类似函子的映射操作Mu
{-# LANGUAGE RankNTypes #-}
newtype Mu f = InF {outF :: f (Mu f)}
mumap :: Functor f => (forall a. f a -> g a) -> Mu f -> Mu g
mumap f (InF m) = InF $ f $ fmap (mumap f) m
Run Code Online (Sandbox Code Playgroud)
虽然我不确定它对你的情况有多大用处。:)