首先,这是一项任务,所以我不想要一个完整的解决方案:)
我将计算Cardgame二十一点中牌组的价值。
规则所有 Aces为1或11.
假设我的手是:(Ace,5),我的手现在是16.下一张牌是6,我的手现在(Ace,5,6)22但是我之前已经计算过的ace现在必须改为一个,所以我的手在12点。
我的Hand数据类型是由
递归定义的data Hand = Empty | Add Card Empty
所以用
计算一个固定值的牌valueOfHand (Add c h) = cardValue c + valueOfHand h
更改之前出现的值的模式是什么?
答案 0 :(得分:1)
我不确定你的班级是否已经覆盖了列表monad,但我认为这是解决这个问题最自然的方法。因此,不应让cardValue
返回一个简单的值,而应返回一个非确定性值,列出该卡可能具有的所有可能值,即
cardValue :: Card -> [Int]
cardValue Ace = [1, 11]
cardValue Two = [2]
...
valueOfHand
将有两个部分:一个用于计算所有可能的手值的列表,另一个用于选择最佳的合法手牌。
如果这足以让您解决它或者您需要更多提示,请告诉我。
答案 1 :(得分:0)
如果您在评论中指出,Ace
每手只能有一个值(因此三个Ace
的手牌是3或33),那么定义你的是有意义的valueOfHand :: Hand -> Integer
的功能首先是非Ace
卡,然后处理Ace
。
我希望这样的功能可以基于这样的东西:
valueOfHand Empty = 0
valueOfHand h = valueOfAces (filter (\c -> c == Ace) h) (filter (\c -> c /= Ace) h)
对于某些功能valueOfAces :: Hand -> Hand -> Integer
。