我有这个代码,我试图将卡片插入手中。如果手是空的,我希望手握住插入的卡并指向下一个空手。如果手不是空的,我想看看手中的下一张牌。一旦到达,如何将空手(c,空)分配给空手?
感谢。
let rec insert c h = match h with
| Empty -> Hand (c, Empty)
| Hand (c', h') -> Hand (c', insert c h')
现在我正在玩上面的代码。以下是输出的示例:
# let hand0:hand = Hand ((Ace, Spades), Hand ((King, Diamonds), Empty));;
val hand0 : hand = Hand ((Ace, Spades), Hand ((King, Diamonds), Empty))
# insert (Ten, Hearts) hand0;;
- : hand = Hand ((Ten, Hearts), Empty)
# hand0;;
- : hand = Hand ((Ace, Spades), Hand ((King, Diamonds), Empty))
显然,hand0的内容不会改变。我真的不明白我需要写什么来达到手的空手上的新值。 另外,我认为递归至少会显示手的第一部分(它不是空的),但这也不起作用。我真的不明白为什么?
答案 0 :(得分:1)
原来我说得对,我只是没有正确地调用这个功能。无缘无故浪费几个小时的方法..
# let hand0:hand = Hand ((King, Spades), Empty);;
val hand0 : hand = Hand ((King, Spades), Empty)
# let hand0 = insert (Ace, Diamonds) hand0;;
val hand0 : hand = Hand ((King, Spades), Hand ((Ace, Diamonds), Empty))
答案 1 :(得分:1)
在OCaml中,您无法分配给变量。任何变量。语言中没有语法可以做到。
let someVar = something
声明并初始化let
正文范围内的新变量。一旦定义了变量,其值就不会改变。
在您的"答案"中,您在外部作用域中定义了一个名为hand0
的变量,然后您定义了另一个另一个(完全独立的)变量内部作用域中的hand0
,它隐藏了外部作用域中的hand0
。但是,您应该注意,这不会影响外部hand0
。你不妨把它命名为不同的东西:
let hand0 = Hand ((King, Spades), Empty) in
let hand1 = insert (Ace, Diamonds) hand0 in ...
答案 2 :(得分:0)
这看起来像是一项任务,所以我觉得我应该给出一个提示。你的第二个案例实质上是说你要扔掉卡片c'
。您可以看到这一点,因为c'
没有显示在结果中。我认为您要做的是保留c'
,因此您可能需要在结果中加入Hand
c'
。我希望这会有所帮助。
答案 3 :(得分:0)
我暂时没有看过ocaml语法,但我确定你想要这样的东西:
Add last
let rec insert c h = match h with
Empty -> Hand (c, Empty)
| Hand (c', h') -> Hand (c', insert c h')
Add first is trivial
let insert c h = Hand (c, h)