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

Type kind error when creating instance of Functor typeclass

我正在尝试为一个非常普通的类型实现 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-system 还不是很熟悉。

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

instance functorFoo :: Functor (Foo a) where

我需要定义为:

instance functorFoo :: Functor Foo where

但我还是想知道为什么第一个版本不起作用。就像 Functor 类型类与例如第一个版本运行良好的 Semigroup。

But I'd still like to find out why does the first version not work. Like how does the Functor typeclass differ from e.g. Semigroup where the first version worked just fine.

我们来看看Functor类型的定义class:

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

它在map的类型签名中包含f af b类型,这清楚地表明f属于Type -> Type(它"carries"另一种类型)。另一方面 Semigroup 显然与种类 Type:

的普通类型相关
class Semigroup a where
  append :: a -> a -> a

所以 Semigroup 是一个 class,它可以定义为普通类型,如 StringIntList aMap k v 或甚至是函数 a -> b(也可以写成 (->) a b),但不是类型构造函数,它需要另一种类型,例如 List Map k (->) a(我必须使用这个符号在这里)。

另一方面,Functor class 需要类型构造函数,因此您可以拥有 Functor ListFunctor (Map k)Functor ((->) a).[=35= 这样的实例]