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”表达式