如何解决无法理解为什么此 OCaml 代码段无法编译
我是 OCaml 和一般函数式编程的新手,我在语法上挣扎。我发现编写程序很困难,因为在我看来,我将编写我理解的基本相同的代码,但一方面,一个代码段编译和运行没有问题,而另一个则没有。>
这是一个这样的案例:
let foo () =
let x = ref 0 in !x
;;
val foo : unit -> int = <fun>
编译没有问题。我对上述片段的理解是,当我们调用 foo
时,我们将 x
绑定到对存储 0 的内存单元的引用,然后取消引用 x
。
现在这个片段:
let seed = ref 6;;
let show_ref () =
let seed:=!seed+1 in !seed
;;
不会编译,我不明白为什么。在我看来,我们在这里做的事情基本上是一样的;我们创建一个绑定 seed
到包含值 6
的内存单元的引用。然后,我们创建一个函数来增加存储在 seed
引用的单元格中的事物,然后我们取消引用 seed
。
这可能是因为我遗漏了一些基本的东西,但我不明白为什么第一件事很好,另一件事不好。有人能帮我弄清楚这里到底发生了什么吗?
谢谢!
解决方法
有一个 OCaml 语言结构:
let name = expression1 in expression2
没有 OCaml 语言结构:
let name := expression1 in expression2
看待这一点的一种方式是 =
在第一种情况下不是运算符。它只是 let
语法的一部分。这意味着您不能像尝试那样用任意其他运算符替换它。
为了完整起见,以下是编写第二个函数的方法:
let show_ref () =
seed := !seed + 1;
!seed
请注意,在此代码中 =
不是运算符。但 !
、:=
和 +
是运算符。您可以为这三个操作定义其他符号(尽管您需要注意优先级)。但是您不能定义不同的符号来代替 =
表达式中的 let
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。