Ocaml 如何将新值分配给用户定义的类型?

Ocaml 如何将新值分配给用户定义的类型?,ocaml,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

我有一个密码,我想把一张卡片插入一只手。如果这只手是空的,我希望这只手拿着插入的卡片,指向下一只空的手。如果手牌不是空的,我想看看手上的下一张牌。到达空手后,如何将手(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的内容没有改变。我真的不明白我需要写些什么,以便在到达手的空手时为它指定一个新值。
此外,我认为递归至少会显示手的第一部分(不是空的),但这也不起作用。我真的不明白为什么?

这看起来像是一项作业,所以我觉得我应该给你一个提示。您的第二个案例本质上是说,您想扔掉卡
c'
。您可以看到这一点,因为
c'
不会显示在结果中。我认为您要做的是保留
c'
,因此您可能需要在结果中包含一个
手部
,其中包含
c'
。我希望这能有所帮助。

我已经有一段时间没有研究过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)

结果证明我是对的,只是没有正确调用函数。无缘无故地浪费几个小时

# 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))

在OCaml中,不能为变量赋值。任何变量。语言中没有语法来执行此操作

let someVar=something
声明并初始化
let
主体范围内的新变量。定义变量后,其值不能更改

在您的“回答”中,您在外部范围内定义了一个名为
hand0
的变量,然后在内部范围内定义了另一个名为
hand0
的(完全独立的)变量,该变量将
hand0
隐藏在外部范围之外。但是,您应该注意,这不会影响外部
hand0
。你不妨给它起个不同的名字:

let hand0 = Hand ((King, Spades), Empty) in
let hand1 = insert (Ace, Diamonds) hand0 in ...

在我看来,我想保留我实际插入的c。如果手牌不是空的,它已经有一张牌了。我不管这是什么卡。我只想看看它指向的那只手,它是
h'
,这就是我调用
insert ch'
的原因。我的问题是,我认为我对空案例的声明是错误的,因为我得到了一个语法错误。到达
Empty
案例后,如何分配
h=Hand(c,Empty)
?这是我的问题。另外,它给我的语法错误是
字符2-3
,这意味着我的空大小写是
。我打错了什么?我不明白我应该如何修改我手上的内容。你能再看一下我的代码吗?我包括了它如何运行的示例。