我正在尝试为非常简单的类型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系统。
答案 0 :(得分:2)
但是我仍然想找出为什么第一个版本不起作用。就像Functor类型类与例如Semigroup的第一个版本工作得很好。
让我们看一下Functor
类型类的定义:
class Functor f where
map :: forall a b. (a -> b) -> f a -> f b
它包含f a
的类型签名中的f b
和map
类型,明确表明f
是Type -> Type
类型(它“携带”另一个类型)。另一方面,Semigroup
显然与类型Type
的普通类型有关:
class Semigroup a where
append :: a -> a -> a
因此Semigroup
是一个类,可以为诸如String
,Int
,List a
,Map k v
甚至函数{{1 }}(也可以写为a -> b
),但不需要类型构造函数,而该构造函数需要(->) a b
List
Map k
之类的其他类型(我必须在这里使用此表示法)。 / p>
另一方面,(->) a
类需要类型构造函数,因此您可以拥有Functor
,Functor List
或Functor (Map k)
之类的实例。
答案 1 :(得分:0)
我找到了解决方案。而不是将其定义为:
instance functorFoo :: Functor (Foo a) where
我需要将其定义为:
instance functorFoo :: Functor Foo where
但是我仍然想找出为什么第一个版本不起作用。就像Functor类型类与例如Semigroup的第一个版本工作得很好。