嗨,我在总结我的手时遇到了问题,因为Ace可以是1或11。我怎样才能使一个函数接收到一只手(卡片和计算总价值)?
以下是我到目前为止所拥有的:
handValue :: [Card]->[Int]
handValue [] = 0
handValue (x:xs) = sum((val x)++([handValue xs]))其中,val已经定义,并从卡片返回一个值数组。例如val ("Ace","Hearts")给1,11 val (“5”,"Hearts")
如有任何指示,将不胜感激。
编辑:在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])]发布于 2013-10-25 18:35:09
除了修复你的功能,你应该注意为什么它一开始就不起作用。首先,你给出的类型是
handValue :: [Card] -> [Int]但是,递归定义有单个值,而不是结果类型(第一个方程中的0文字;第二个方程中的Num a => [a] -> a )的使用。
现在,假设类型更改为[Card] -> Int,您的定义将是合法的,但是结果会很奇怪。第二个方程是:
handValue (x:xs) = sum((val x)++([handValue xs]))如果x是ace,会发生什么?val x将是[1, 11],因此这两个值都将被连接起来并包含在和中。实际上,你的王牌现在不是1分或11分,而是12分!N.M.的解决方案,我在这里解释为
Prelude> map sum . sequence $ [[1,11], [5], [6]]
[12,22]通过为aces (sequence)的所有可能选项生成值列表,并单独将所有可能性(map sum)相加,从而绕过问题,生成一个值列表(如您最初给出的签名)。然而,这并不能完全解决这个问题,因为你最终需要决定其中的一种可能性。现在我们可能有足够的材料来回答一个不同的问题,一旦你到了那个地步.
发布于 2013-10-25 17:32:24
Prelude Control.Monad> liftM sum . sequence $ [[1,11], [5], [6]]
[12,22]https://stackoverflow.com/questions/19595931
复制相似问题