簡體   English   中英

在 Purescript 中為 NonEmpty 編寫 Functor 實例與編寫 Eq 實例

[英]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類將適用於MaybeList ,但不適用於IntString ,同樣不適用於Maybe IntList String

NonEmpty類型確實帶有一個參數,因為它是這樣定義的:

data NonEmpty a = ...

但是,一個類型NonEmpty a帶參數,不管是什么a可能。

另一方面,類EqSemigroup期望一個沒有任何參數的類型。 所以這些類可以應用於IntStringMaybe Boolean和任何其他沒有參數的類型,包括NonEmpty a ,不管a可能是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM