Toplevel中的OCaml双分号错误

时间:2017-06-12 07:56:56

标签: syntax-error ocaml

我在OCaml toplevel中收到这个奇怪的语法错误。

# #use "ex_8_4.ml";;
type blob = {
  get : unit -> float * float;
  area : unit -> float;
  set : float * float -> unit;
  move : float * float -> unit;
}
val new_rectangle : float -> float -> float -> float -> blob = <fun>
# let rect1 = new_rectangle 0.0 0.0 1.0 1.0 in  
  let rect2 = {rect1 with set = (fun _ -> ())};;
Error: Syntax error

复制未能包括错误中用分号加下划线。

2 个答案:

答案 0 :(得分:5)

之所以会发生这种情况,是因为顶层需要in个关键字而不是分号:

> let a = 1 in let b = 2;;
Error: Syntax error

一种解决方法是在最后添加in

> let a = 1 in let b = 2 in a + b;;
- : int = 3

但最简单的方法是结束每个让分号绑定:

> let a = 1;;
val a : int = 1
> let b = 2;;
val b : int = 2
> a + b;;
- : int = 3

答案 1 :(得分:0)

IonuţG。Stan的答案是正确的,如果您想要定义rect1以供将来使用,或者您不介意它已定义。如果您希望在定义rect1时仅定义本地用rect2,则可以使用此方法:

# type ints = {a : int;  b : int};;
(* type ints = { a : int; b : int; } *)
# let y =
   let x = {a = 1; b = 2} in
   {x with b = 5};;
(* val y : ints = {a = 1; b = 5} *)
# x;;
(* Error: Unbound value x *)