簡體   English   中英

在 Haskell 中使用自定義數據類型

[英]using custom data types in haskell

我制作了這些自定義數據類型:

data BakedGoods = Muffin
                | Croissant
                | Cookie
                deriving (Eq, Show)

data Muffin = Blueberry
            | SaltedCaramel
            | Cheesecake

然后我嘗試在返回 BakedGoods 價格的函數中使用它們:

price :: BakedGoods -> Int
price a 
  | a == Blueberry = 2

[...]

我不斷收到此錯誤:

 Couldn't match expected type ‘BakedGoods’ with actual type ‘Muffin’

我明白了,但不幸的是我不知道如何解決它,你有什么想法嗎? :)

這對初學者來說有點混亂。

代數數據類型的形式如下: data typename = constructor1 | 構造函數2

類型可以與構造函數同名,即使是不同的類型。 所以你的代碼有兩個不同的Muffin s - 一個叫做Muffin類型(帶有構造函數BlueberrySaltedCaramelCheescake ),以及一個用於類型BakedGoods構造函數Muffin 就編譯器而言,它們是完全沒有聯系的。

您想要的代碼如下所示:

data BakedGoods = Muffin Muffin
    | ...

這意味着: BakedGoods類型有一個名為Muffin構造函數,其中包含一個Muffin類型的字段

然后你可以像這樣模式匹配它:

price :: BakedGoods -> Int
price (Muffin Blueberry) = 2
...

這意味着:當參數(必須是BakedGoods )具有匹配Muffin的頂級構造函數,其字段(類型Muffin )匹配Blueberry ,則返回 2。

哈斯克林快樂!

如果你寫

data BakedGoods = Muffin | …
那么這不是Muffin類型的數據構造函數與其他數據構造函數的聯合。 你在這里只是說BakedGood s 有一個名為Muffin的數據構造函數,事實上有一個名為Muffin的類型並不重要。

您可以在Muffin數據構造函數中包裝一個Muffin對象,例如:

data BakedGoods
  = Muffin Muffin  -- ← parameter for the Muffin data type
  | Croissant
  | Cookie
  deriving (Eq, Show)

然后,您可以對包裹在Muffin數據構造函數中的值執行模式匹配:

price :: BakedGoods -> Int
price (Muffin Blueberry) = 2

當你做

data BakedGoods = Muffin -- ...
data Muffin = Blueberry -- ...

並不是BakedGoods的數據構造函數應該包括所有Muffin的數據構造函數。 實際上是說您應該創建一個新的Muffin數據構造函數,與Muffin類型完全無關,並且Muffin數據構造函數是BakedGood 如果要合並兩者,則聲明它們合並:

data BakedGoods = Blueberry
                | SaltedCaramel
                | Cheesecake
                | Croissant
                | Cookie

那么Blueberry將成為BakedGoods 但是,如果你想保留它們是松餅的事實,那么你可以制作一個MuffinFlavor類型並讓你的Muffin包含一個MuffinFlavor

data BakedGoods = Muffin MuffinFlavor
                | Croissant
                | Cookie

data MuffinFlavor = Blueberry | SaltedCaramel | Cheesecake

現在您可以使用Muffin Blueberry制作松餅。

暫無
暫無

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

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