OCaml - 如何在匹配表达式中放置一个 let 绑定?

Posted

技术标签:

【中文标题】OCaml - 如何在匹配表达式中放置一个 let 绑定?【英文标题】:OCaml - How to put a let binding inside a match expression? 【发布时间】:2014-02-17 17:05:12 【问题描述】:

我有如下代码语句:

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 的引用变量,但不返回实际值。

【问题讨论】:

我猜你想要做的是 l := r 但我们不太确定,因为你没有提供命令的类型定义。 这正是我想做的。我省略了 def 类型以尽量保持示例简短。谢谢! 【参考方案1】:

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

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

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

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

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

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

【讨论】:

感谢杰弗里的详细解释!

以上是关于OCaml - 如何在匹配表达式中放置一个 let 绑定?的主要内容,如果未能解决你的问题,请参考以下文章

在 OCaml 中分隔多个“let”声明,后跟一个“let in”表达式

Lisp 的 let* 的 Ocaml 等价物?

OCaml:在另一个内部匹配表达式?

玩!:如何在 groovy 表达式中放置属性值

如何可选地提供 OCaml (let*) 运算符以与新旧编译器一起使用?

“let () =”在 Ocaml 中是啥意思?