Class 编写函子实例与在Purescript中为非空编写Eq实例
我目前正在通过阅读这本书来学习Purescript(到目前为止,这是我发现的唯一一个广泛涉及该语言的资源) 我正在尝试实现第6.7节(实例依赖项)中的练习,但我无法理解以下编译器错误: 我已经为数据类型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
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 = ...