我有这种类型
type Card = (CardValue,Suite)
我想编写一个基于Card.Suite
值显示颜色的函数
colour :: Card -> Colour
colour card = if card.Suite == Spades then Red else Black
此代码仅说明了我想要实现的目标。我不知道如何从Card(CardValue,Suite)
实际获得套间价值。
答案 0 :(得分:7)
type
关键字声明了新类型的synonim,而不是新类型。在您的代码中,Card
只是CardValue
和Suite
的元组。
要访问对元素,请使用fst
和snd
:
colour card = if snd card == Spades then Red else Black
或模式匹配参数:
colour (value,suite) = if suite == Spades then Red else Black
答案 1 :(得分:4)
type Card = (CardValue, Suit)
使Card
成为CardValue
和Suit
数据元组的类型别名。那可能不是最好的数据结构(使用记录语法的data
成员似乎更好),但是做您想做的事很简单:
data Suit = Spades | Clubs | Hearts | Diamonds
data Color = Red | Black
type Card = (CardValue, Suit)
getSuitColor :: Card -> Color
getSuitColor (_, Spades) = Black
getSuitColor (_, Clubs) = Black
getSuitColor _ = Red
或者您可以使用警卫队做同样的事情
getSuitColor :: Card -> Color
getSuitColor (_, suit)
| suit == Spades = Black
| suit == Clubs = Black
| otherwise = Red
但是您必须在deriving Eq
上使用Suit
(否则,您将无法==
!)
如果这是我,我可能会使用上面提到的记录语法
data Card { rank :: CardValue
, suit :: Suit
}
这意味着您必须构造Card
,因为它们是单独的类型。
myOldCard = (3, Spades)
myNewCard = Card 3 Spades
但这意味着您已经对它们进行了现成的查找。
getColor :: Card -> Color
getColor = determineColor . suit
where
determineColor :: Suit -> Color
determineColor Spades = Black
determineColor Clubs = Black
determineColor _ = Red