Ocaml 在let表达式中使用整数引用

Ocaml 在let表达式中使用整数引用,ocaml,Ocaml,我正在尝试本课程第5课第6步中的代码示例 我们应该修复此代码示例: let one = let accum = ref -54 in for i = 1 to ten do accum := !accum + i done ; !accum 以下是我的尝试: let one = let accum = ref -54 in ( for i = 1 to 10 do accum := accum + i done ;

我正在尝试本课程第5课第6步中的代码示例

我们应该修复此代码示例:

let one =
  let accum = ref -54 in
  for i = 1 to ten do accum := !accum + i done ;
  !accum
以下是我的尝试:

let one =
  let accum = ref -54 in (
      for i = 1 to 10 do
        accum := accum + i
      done
    ;
      !accum
    )
但不幸的是,我收到了错误消息:

第2行,字符14-17:错误:此表达式具有类型“a->”a ref 但表达式应为int类型


-54周围缺少括号

let one =
  let accum = ref (-54) in
  for i=1 to 10 do
    accum := !accum + i
  done;
  !accum
;;

ref
是一个类型为
'a->'a ref
的函数,减号运算符
(-)
的类型为
int->int->int
。这里,
54
是一个
int
,但
ref
不是,因此类型错误消息。

ocaml的lexer的一个奇怪之处是
-54
对应两个令牌

因此,您的代码对应于

设累计=参考(-)54英寸


这将产生所提到的类型错误。解决方法是添加括号并写入
(-54)

,您还可以使用
~-
,这是前缀整数求反运算符,避免了需要包装额外的参数。很好,我不知道这一点。