如何为用户定义的类型分配新值?

时间:2014-09-20 02:23:49

标签: ocaml

我有这个代码,我试图将卡片插入手中。如果手是空的,我希望手握住插入的卡并指向下一个空手。如果手不是空的,我想看看手中的下一张牌。一旦到达,如何将空手(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的内容不会改变。我真的不明白我需要写什么来达到手的空手上的新值。 另外,我认为递归至少会显示手的第一部分(它不是空的),但这也不起作用。我真的不明白为什么?

4 个答案:

答案 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)