代码之家  ›  专栏  ›  技术社区  ›  Maxxx

haskell中map在函数参数上的应用

  •  1
  • Maxxx  · 技术社区  · 7 年前

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

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

    data Card = Card Suit Rank
    

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

    比较王牌和手牌的花色 看看吧 但我在特朗普和我的手的两个论点之间进行了问题映射,因为我只知道如何映射一个论点,而不知道如何映射两个论点。

    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'
    

    输出真值 因为手中的牌里确实有一个黑桃,这也是王牌的套牌。

    编辑: 更新第二个场景。如果我把手中和特朗普有同样花色的牌还回去,而不是说是真是假:

    checkTrump :: Card -> [Card] -> Card
    checkTrump trump myhand = filter ((cardSuit trump) `elem` (map cardSuit myhand))
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Robin Zigmond    7 年前

    我觉得你把事情搞得太复杂了:

    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
    
    推荐文章