创建Functor类型类的实例时出现类型错误

时间:2018-11-22 12:14:11

标签: typeclass functor purescript

我正在尝试为非常简单的类型Functor实现Foo类型类实例:

data Foo a = Foo a

instance functorFoo :: Functor (Foo a) where
  map fn (Foo a) = Foo (fn a)

Purescript给了我不太有用的错误消息:

Could not match kind

    Type -> Type

with kind

    Type

是什么意思?我还不太熟悉Kind系统。

2 个答案:

答案 0 :(得分:2)

  

但是我仍然想找出为什么第一个版本不起作用。就像Functor类型类与例如Semigroup的第一个版本工作得很好。

让我们看一下Functor类型类的定义:

class Functor f where
  map :: forall a b. (a -> b) -> f a -> f b

它包含f a的类型签名中的f bmap类型,明确表明fType -> Type类型(它“携带”另一个类型)。另一方面,Semigroup显然与类型Type的普通类型有关:

class Semigroup a where
  append :: a -> a -> a

因此Semigroup是一个类,可以为诸如StringIntList aMap k v甚至函数{{1 }}(也可以写为a -> b),但不需要类型构造函数,而该构造函数需要(->) a b List Map k之类的其他类型(我必须在这里使用此表示法)。 / p>

另一方面,(->) a类需要类型构造函数,因此您可以拥有FunctorFunctor ListFunctor (Map k)之类的实例。

答案 1 :(得分:0)

我找到了解决方案。而不是将其定义为:

instance functorFoo :: Functor (Foo a) where

我需要将其定义为:

instance functorFoo :: Functor Foo where

但是我仍然想找出为什么第一个版本不起作用。就像Functor类型类与例如Semigroup的第一个版本工作得很好。