创建 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 a
和f b
类型,这清楚地表明f
属于Type -> Type
(它"carries"另一种类型)。另一方面 Semigroup
显然与种类 Type
:
的普通类型相关
class Semigroup a where
append :: a -> a -> a
所以 Semigroup
是一个 class,它可以定义为普通类型,如 String
、Int
、List a
、Map k v
或甚至是函数 a -> b
(也可以写成 (->) a b
),但不是类型构造函数,它需要另一种类型,例如 List
Map k
(->) a
(我必须使用这个符号在这里)。
另一方面,Functor
class 需要类型构造函数,因此您可以拥有 Functor List
、Functor (Map k)
或 Functor ((->) a)
.[=35= 这样的实例]
我正在尝试为一个非常普通的类型实现 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 a
和f b
类型,这清楚地表明f
属于Type -> Type
(它"carries"另一种类型)。另一方面 Semigroup
显然与种类 Type
:
class Semigroup a where
append :: a -> a -> a
所以 Semigroup
是一个 class,它可以定义为普通类型,如 String
、Int
、List a
、Map k v
或甚至是函数 a -> b
(也可以写成 (->) a b
),但不是类型构造函数,它需要另一种类型,例如 List
Map k
(->) a
(我必须使用这个符号在这里)。
另一方面,Functor
class 需要类型构造函数,因此您可以拥有 Functor List
、Functor (Map k)
或 Functor ((->) a)
.[=35= 这样的实例]