首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Blackjack游戏

Haskell Blackjack游戏
EN

Stack Overflow用户
提问于 2013-10-25 17:22:55
回答 2查看 1K关注 0票数 0

嗨,我在总结我的手时遇到了问题,因为Ace可以是1或11。我怎样才能使一个函数接收到一只手(卡片和计算总价值)?

以下是我到目前为止所拥有的:

代码语言:javascript
复制
handValue :: [Card]->[Int]
handValue [] = 0
handValue (x:xs) = sum((val x)++([handValue xs]))

其中,val已经定义,并从卡片返回一个值数组。例如val ("Ace","Hearts")给1,11 val (“5”,"Hearts")

如有任何指示,将不胜感激。

编辑:在duplodes建议之后,我有以下内容:

代码语言:javascript
复制
    handValue :: [Card]->[Int]
handValue [] = 0
handValue (x:xs) = 
            if (val x ==[1,11])
            then    (map sum (sequence [[1,11], handValue xs]))
                else [ sum [(val x)]++([handValue xs])]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-25 18:35:09

除了修复你的功能,你应该注意为什么它一开始就不起作用。首先,你给出的类型是

代码语言:javascript
复制
handValue :: [Card] -> [Int]

但是,递归定义有单个值,而不是结果类型(第一个方程中的0文字;第二个方程中的Num a => [a] -> a )的使用。

现在,假设类型更改为[Card] -> Int,您的定义将是合法的,但是结果会很奇怪。第二个方程是:

代码语言:javascript
复制
handValue (x:xs) = sum((val x)++([handValue xs]))

如果x是ace,会发生什么?val x将是[1, 11],因此这两个值都将被连接起来并包含在和中。实际上,你的王牌现在不是1分或11分,而是12分!N.M.的解决方案,我在这里解释为

代码语言:javascript
复制
Prelude> map sum . sequence $ [[1,11], [5], [6]]
[12,22]

通过为aces (sequence)的所有可能选项生成值列表,并单独将所有可能性(map sum)相加,从而绕过问题,生成一个值列表(如您最初给出的签名)。然而,这并不能完全解决这个问题,因为你最终需要决定其中的一种可能性。现在我们可能有足够的材料来回答一个不同的问题,一旦你到了那个地步.

票数 1
EN

Stack Overflow用户

发布于 2013-10-25 17:32:24

代码语言:javascript
复制
Prelude Control.Monad> liftM sum . sequence $ [[1,11], [5], [6]]
[12,22]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19595931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档