【问题标题】:Utilizing map in haskell on function arguments在函数参数上使用haskell中的map
【发布时间】:2018-10-13 15:18:15
【问题描述】:

我在 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

我遇到的问题是我正在尝试编写一个函数来比较王牌和手牌的花色并查看手牌是否包含王牌,但我在映射 trump 和 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,因为手中的牌确实包含黑桃,它也是王牌的花色。

编辑: 更新第二种情况。如果我要返回与王牌相同花色的手牌,而不是返回真假:

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

【问题讨论】:

    标签: haskell


    【解决方案1】:

    我认为你过于复杂了:

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

    (对我来说,对于trump 参数,函数只取花色而不是整张牌对我来说更有意义。但上面的内容应该适用于您尝试创建的函数。)

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

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

    【讨论】:

    • 嗯不知道我把它复杂化了。但是,如果我要返回与王牌具有相同花色的手牌,而不是返回一个布尔值是真还是假,它仍然成立吗?我会为此更新帖子。
    • 好吧,不,上面返回一个布尔值 - 这就是你的问题暗示你所追求的。您必须对其进行修改以返回实际卡。 (使用filter 似乎是最明显的方式,假设您想要返回手中的所有王牌。)
    • 完美!我更喜欢使用过滤器来检索与王牌花色相同的卡片,而不是更简单的返回 True 或 False 的方法。我使用过滤器的想法在帖子中更新。如果你能看一下它并给我一些反馈,我将不胜感激,因为我刚开始函数式编程
    • 我已经编辑了我上面的答案来处理你的第二个问题。 (PS 我对函数式编程和 Haskell 也比较陌生。)
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2020-02-27
    • 2020-10-08
    相关资源
    最近更新 更多