我有一个类
的定义class Functor f => Pointed f where
pure :: a -> f a
现在我想为Maybe
制作实例。为什么这不起作用?
instance Pointed (Maybe s) where
pure Nothing = Nothing
pure (Just a) = a
class Functor f where
fmap :: (a->b) -> f a -> f b
错误是:
Kind mis-match
The first argument of `Pointed' should have kind `* -> *',
but `Maybe s' has kind `*'
In the instance declaration for `Pointed (Maybe s)'
Failed, modules loaded: none.
答案 0 :(得分:7)
在Pointed
的定义中,f
具有种类* -> *
,因此您需要提供具有相同类型的类型构造函数。 Maybe
有(Maybe s)
类,*
有Maybe
种。如果您在f
的定义中将pure
替换为pure :: a -> Maybe a
,则会获得:
instance Pointed Maybe where
pure a = Just a
因此,您的定义应如下:
* -> *
由于kind inference的规则,f
推断了a
种类。假设*
具有种类* -> * -> *
,因为它是一个函数参数(具有种类f a
)。 *
应该有f
种,* -> *
有Pointed
种。
在Functor f =>
的定义中,Functor
是一个类上下文,并声明Pointed
是Pointed
的超类。这意味着Functor
的所有实例也必须是Maybe
的实例。
Functor
已经是r_network
的一个实例,所以您不需要自己定义它。