0

我有以下代码语句:

let execute command = 
match command with
|Skip -> ()
|Changestate (l,r) -> (let l = ref r)
|_ -> failwith "Not a command"

当我在顶层运行它时,我收到以下错误:

1 let execute command = 
2 match command with
3 |Skip -> ()
4 |Changestate (l,r) -> (let l = ref r)
5 |_ -> failwith "Not a command";;
6 Error: Syntax error

语法错误似乎出现在第 4 行末尾的括号中。我希望这一行做的是将 l 处的值更改为 r 的引用变量,但不返回实际值。

4

1 回答 1

2

好吧,camlspotter 已经给出了很好的答案,但这就是我要说的。

首先,没有 OCaml 表达式let var = expr,除了在模块的顶层定义模块的导出名称。

在所有其他地方,表达式看起来像let var = expr1 in expr2. 因此,正如编译器告诉您的那样,您的代码在语法上是错误的。

其次,即使您的代码在语法上是正确的,该表达式也会let l ...定义一个变量l,与它之前的模式中的变量无关。

第三,您不提供任何类型,因此很难为您提供帮助(正如 camlspotter 所说)。但一般来说,您无法更改 的值l。OCaml 中的标识符不可变地绑定到它的值。

如果l绑定(不可变!)到正确类型的引用,您可以使用表达式设置引用中的值l := r

于 2014-01-27T02:28:52.680 回答