[英]Writing Functor instance vs. writing Eq instance for NonEmpty in Purescript
我目前正在通過閱讀Purescript by Example書來學習 Purescript(迄今為止我發現的唯一涵蓋該語言的資源之一)。
我正在嘗試實現第 6.7 節(實例依賴性)中的練習,但我無法理解以下編譯器錯誤:
我已經為數據類型data NonEmpty a = NonEmpty a (Array a)
實現了 Semigroup 和 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 實例時,我得到了上面的錯誤。 似乎有效的是:
instance functorNonEmpty :: Functor NonEmpty where
map f (NonEmpty h t) = NonEmpty (f h) (map f t)
現在,這是為什么呢? 我想不通。 謝謝!
這就是Functor
類的定義方式:它適用於帶參數的類型。 因此,例如, Functor
類將適用於Maybe
和List
,但不適用於Int
或String
,同樣不適用於Maybe Int
或List String
。
NonEmpty
類型確實帶有一個參數,因為它是這樣定義的:
data NonEmpty a = ...
但是,一個類型NonEmpty a
不帶參數,不管是什么a
可能。
另一方面,類Eq
和Semigroup
期望一個沒有任何參數的類型。 所以這些類可以應用於Int
、 String
、 Maybe Boolean
和任何其他沒有參數的類型,包括NonEmpty a
,不管a
可能是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.