簡體   English   中英

它可以引用`Data.Monoid。<>

[英]It could refer to either `Data.Monoid.<>'

我有以下聲明:

data Two a b = Two a b deriving (Eq, Show)

instance (Semigroup a, Semigroup b) => Semigroup (Two a b) where
  (Two a b) <> (Two c d) = Two (a <> c) (b <> d)

並在前奏中嘗試過:

*Main First Lib MonoidLaws Semi>   (Two a b) <> (Two c d) = Two (a <> c) (b <> d)

<interactive>:10:3: error:
    * Occurs check: cannot construct the infinite type: t1 ~ Two t1 t1
      Expected type: t1 -> t -> b
        Actual type: Two t1 t1 -> Two t t -> Two b b
    * Relevant bindings include
        (<>) :: t1 -> t -> b (bound at <interactive>:10:3)

如何使用mappend功能從SemigroupTwo在前奏數據類型?

嘗試使用Semigroup實例的東西,例如List

例如:

> (Two "1" "2") <> (Two "3" "4")

Two "13" "24"

在您的嘗試/示例中,未定義abcd ,因此Haskell將其視為變量。 因為您在它們之間使用= ,所以假設您要進行模式匹配,因此它試圖將它們與自身進行匹配,這將導致無限循環(因為這完全有效,Haskell –根據自身定義值)。 但是,這將導致錯誤,因為這將暗示一個無限類型 ,這顯然不是您想要的。

可能應該從一些簡單的事情開始。 我幫助作者撰寫的一本不錯的基礎書是http://happylearnhaskelltutorial.com,但是它與實例化您自己的類型類無關。 話雖如此,它可以使您對模式匹配,變量,類型和值有一個相當好的了解,然后再繼續理解足以構建自己的實例的類型類。

暫無
暫無

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

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