无法理解为什么这个 OCaml 片段无法编译

Trouble understanding why this OCaml snippet won't compile

我是 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 表达式中定义一个不同的符号来代替 =