Ocaml 如何将新值分配给用户定义的类型?
我有一个密码,我想把一张卡片插入一只手。如果这只手是空的,我希望这只手拿着插入的卡片,指向下一只空的手。如果手牌不是空的,我想看看手上的下一张牌。到达空手后,如何将手(c,空)分配给空手 谢谢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
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
,这意味着我的空大小写是
。我打错了什么?我不明白我应该如何修改我手上的内容。你能再看一下我的代码吗?我包括了它如何运行的示例。