在Maybe的例子中有点不匹配

时间:2016-03-10 19:00:32

标签: haskell

我有一个类

的定义
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.

1 个答案:

答案 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是一个类上下文,并声明PointedPointed的超类。这意味着Functor的所有实例也必须是Maybe的实例。

Functor已经是r_network的一个实例,所以您不需要自己定义它。