我已经在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))
答案 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