在let <decs> in <exp>
, 中<decs>
需要一个或多个声明。
在你的情况下,你在第 7 行y = 1
- 注意,这不是一个分配,而是一个比较。也就是说,在 C++ 中它相当于做y == 1
. 您不能分配给非参考变量。(通常,您希望尽可能避免使用 ref 变量。)您可以val y = 1
在它的位置做,在这种情况下,您可以创建一个名为 的新值y
,它会覆盖旧值y
(但不会更改它;您创造新价值)。
同样,在第 9 行,你做x := 0
了 ,这不是一个声明,而是一个表达式,它将值分配给0
参考值x
,然后返回单位。
此外,你可以在你的 let 语句中做多个声明,所以你不需要你做的嵌套。
最后,你写p(x)
在顶层。如果前面的声明以分号结尾,则只能在顶层编写表达式;否则它认为它是声明的一部分。那是
val a = 5
6
被解释为
val a = 5 6
简而言之,您可以将其重写为:
val x = ref 0;
fun p(y': int ref)=
let
val y = !y' (* this line might as well be deleted. *)
val y = 1
in
x := 0;
y' := y
end;
p(x)
或者,较短的版本,因为 SML 具有良好的类型推断:
val x = ref 0;
fun p y' = (x := 0; y' := 1);
p x
不过,我会这么说;如果你来自像 C++ 或类似的语言,可能很想使用'a ref
sa 很多,但你会经常发现,最小化它们的使用通常会导致 SML 中的代码更清晰。(和其他函数式语言。)