[英]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
的類型(帶有構造函數Blueberry
, SaltedCaramel
和Cheescake
),以及一個用於類型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.