Haskell Blackjack游戏

时间:2013-10-25 17:22:55

标签: haskell

嗨我总结我的问题,因为Ace可以是1或11.我如何制作一个手牌,即[卡]并计算总值?

这是我到目前为止所做的:

handValue :: [Card]->[Int]
handValue [] = 0
handValue (x:xs) = sum((val x)++([handValue xs]))

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

任何指针都会受到赞赏。

编辑:在duplodes建议后我有这个:

    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])]

2 个答案:

答案 0 :(得分:1)

Prelude Control.Monad> liftM sum . sequence $ [[1,11], [5], [6]]
[12,22]

答案 1 :(得分:1)

除了修复你的功能之外,你应该注意它为什么不能在第一时间起作用。首先,您提供的类型是

handValue :: [Card] -> [Int]

但是你的递归定义有单个值而不是列表作为结果类型(第一个等式中的0字面值;使用sum,第二个是Num a => [a] -> a一个)。

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

handValue (x:xs) = sum((val x)++([handValue xs]))

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

Prelude> map sum . sequence $ [[1,11], [5], [6]]
[12,22]

通过为所有可能的a(sequence)选项生成值列表并分别对所有可能性进行求和(map sum)来绕过问题,从而产生一个值列表(如签名中所示)最初给了)。然而,这并没有完全解决问题,因为你最终需要决定其中一种可能性。现在,一旦你达到这一点,我们可能有足够的材料来解决另一个问题......