如何从类型中获得价值

时间:2019-03-22 03:30:39

标签: haskell functional-programming

我有这种类型

type Card = (CardValue,Suite)

我想编写一个基于Card.Suite值显示颜色的函数

colour :: Card -> Colour
colour card = if card.Suite == Spades then Red else Black

此代码仅说明了我想要实现的目标。我不知道如何从Card(CardValue,Suite)实际获得套间价值。

2 个答案:

答案 0 :(得分:7)

type关键字声明了新类型的synonim,而不是新类型。在您的代码中,Card只是CardValueSuite的元组。

要访问对元素,请使用fstsnd

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成为CardValueSuit数据元组的类型别名。那可能不是最好的数据结构(使用记录语法的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