我是 Haskell 的新手,在访问自定义类型的元素时遇到问题。
我有这些声明:
import Data.Char
import Data.List
data Objekt = Objekt Suit Value
deriving(Eq,Show)
data Suit = Hearts | Spades | Diamonds | Clubs
deriving(Eq,Show)
data Value = Seven | Eight | Nine | Ten | Jack | Queen | King | Ace
deriving(Eq,Show)
data Deck = Deck [Objekt]
deriving(Eq,Show)
现在,我正在创建一个像这样的甲板:
let deck = Deck [Objekt Hearts Seven, Objekt Clubs Queen]
然后我想检查一下甲板:
elem (Objekt Hearts Seven) deck
我收到一个错误:
*Main> elem (Objekt Hearts Seven) deck
<interactive>:8:28: error:
• Couldn't match expected type ‘[Objekt]’ with actual type ‘Deck’
• In the second argument of ‘elem’, namely ‘deck’
In the expression: elem (Objekt Hearts Seven) deck
In an equation for ‘it’: it = elem (Objekt Hearts Seven) deck
甲板显示以下内容:
*Main> deck
Deck [Objekt Hearts Seven,Objekt Clubs Queen]
*Main> :t Deck
Deck :: [Objekt] -> Deck
无论我做什么(我尝试使用地图或列表推导式),我都无法访问牌组的元素。我搜索了一整天,但似乎找不到任何自定义列表类型及其访问的示例。
我是否正确地进行了声明?
我如何测试或提取我的牌组的元素?
有人有想法吗?任何帮助将不胜感激...谢谢
Deck
是一种不同于列表类型的类型,但它恰好包含一个列表。
您可以Deck
使用值构造函数将列表转换为 a :
Deck :: [Objekt] -> Deck
这是您在 eg 中使用的内容let deck = Deck [....]
。
您可以Deck
使用一个小的辅助函数将一个back 转换为一个列表,您可以将其添加到您的文件中:
unDeck :: Deck -> [Objekt]
unDeck (Deck os) = os
在此之后,您可以使用elem someObjekt (unDeck someDeck)
.
正如 Nykros 指出的那样,另一种选择是使用模式匹配。如果您正在学习 Haskell,我建议您习惯模式匹配,因为它在 Haskell 中非常惯用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句