Class 编写函子实例与在Purescript中为非空编写Eq实例

Class 编写函子实例与在Purescript中为非空编写Eq实例,class,types,functor,purescript,Class,Types,Functor,Purescript,我目前正在通过阅读这本书来学习Purescript(到目前为止,这是我发现的唯一一个广泛涉及该语言的资源) 我正在尝试实现第6.7节(实例依赖项)中的练习,但我无法理解以下编译器错误: 我已经为数据类型data NonEmpty a=NonEmpty a(数组a)实现了半群和Eq实例,如下所示: instance eqNonEmpty :: Eq a => Eq (NonEmpty a) where eq (NonEmpty h1 t1) (NonEmpty h2 t2) = h1

我目前正在通过阅读这本书来学习Purescript(到目前为止,这是我发现的唯一一个广泛涉及该语言的资源)

我正在尝试实现第6.7节(实例依赖项)中的练习,但我无法理解以下编译器错误:

我已经为数据类型
data NonEmpty a=NonEmpty a(数组a)
实现了半群和Eq实例,如下所示:

instance eqNonEmpty :: Eq a => Eq (NonEmpty a) where
  eq (NonEmpty h1 t1) (NonEmpty h2 t2) = h1 == h2 && t1 == t2


instance semigroupNonEmpty :: Semigroup (NonEmpty a) where
  append (NonEmpty h1 t1) (NonEmpty h2 t2) = NonEmpty h1 (t1 <> [h2] <> t2)

为什么呢?我想不出来。
谢谢

这就是
Functor
类的定义:它适用于接受参数的类型。因此,例如,
Functor
类将应用于
Maybe
List
,但不应用于
Int
String
,同样也不应用于
Maybe Int
List String

类型
NonEmpty
接受一个参数,因为它是这样定义的:

data NonEmpty a = ...
但是类型
非空a
不接受参数,不管
a
可能是什么


另一方面,类
Eq
Semigroup
期望的类型没有任何参数。因此,这些类可以应用于
Int
String
可能是Boolean
,以及任何其他不带参数的类型,包括
非空a
,而不管
a
可能是什么。

谢谢!这是一个非常简洁明了的解释。我想对如何从其他情况下的类型签名本身推断这一点有更多的了解。这是因为
映射中的
fa
fb
:…
在函子中的定义,其中对所有a b表示
。(a->b)->f a->f b
你能推断出吗?是的,没错。有时也可能有显式的种类签名,如
类函子(f::Type->Type)
。如果编译器不能像从
fa
那样从用法中推断出类型,则可能需要这样做。Coupla建议:该书的“官方”版本已经过时。此分叉是最新的:。另外,PureScript语法与Haskell非常相似,我发现使用Haskell的书籍可以轻松地学习很多PureScript。我发现Haskell从第一原则开始的编程非常彻底,我用PureScript解决了大部分练习。
data NonEmpty a = ...