在函数参数中在haskell中使用map

时间:2018-10-13 15:18:16

标签: haskell

我已经在Haskell中创建了两个对象,主要是王牌和手中的卡。

trump = Card Spade Two
myhand = [Card Diamond Three, Card Spade Two]

其中的卡用以下符号表示:

data Card = Card Suit Rank

我已经编写了一个名为retrieveSuit的函数,该函数可以检索黑桃,菱形,心形等卡片的花色。

retrieveSuit :: Card -> Suit
retrieveSuit (Card suit _) = suit

我遇到的问题是我正在尝试编写一个功能,比较王牌和手牌的花色,并查看如果手牌中包含王牌,但我在王牌和myhand的两个参数上映射时遇到问题,因为我只知道如何映射一个参数,而不能同时映射两个参数。

checkTrump :: Card -> [Card] -> Bool
checkTrump trump myhand = (map retrieveSuit myhand) (retrieveSuit trump) if trump == myhand then True else False

我跑步时出现错误

error: parse error on input `if'

我是否将函数retrieveSuit正确应用于checkTrump的两个参数?在这种情况下,该程序将输出True ,因为手中的纸牌确实包含黑桃,而黑桃也适合王牌。

编辑: 更新第二种情况。如果我要退还与王牌相同的牌,而不是返回true或false:

checkTrump :: Card -> [Card] -> Card
checkTrump trump myhand = filter ((cardSuit trump) `elem` (map cardSuit myhand))

1 个答案:

答案 0 :(得分:2)

我认为您过于复杂了:

checkTrump trump myhand = (retrieveSuit trump) `elem` (map retrieveSuit myhand)

(PS,对于我来说,对于trump参数而言,该函数只接受西装而不是完整的卡片对我来说更有意义。但是上面的内容应该对您要创建的函数起作用。 )

对于第二种情况,您的函数签名实际上没有多大意义,因为您不能保证手中只有一个王牌。可能不止一个-而且也可能没有一个!因此,对我来说最有意义的是将其更改为返回列表,并仅使用filter函数(我还更改了名称以避免混淆,并使其更适合该函数的功能):

getTrumpsInHand :: Card -> [Card] -> [Card]
getTrumpsInHand trump hand = filter checkSuit hand
                                where checkSuit card = retrieveSuit card == retrieveSuit trump