嗨我总结我的问题,因为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])]
答案 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
)来绕过问题,从而产生一个值列表(如签名中所示)最初给了)。然而,这并没有完全解决问题,因为你最终需要决定其中一种可能性。现在,一旦你达到这一点,我们可能有足够的材料来解决另一个问题......