OCaml双倍分号错误
问题描述:
我在OCaml*接收到这种奇怪的语法错误。OCaml双倍分号错误
# #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
复制未能包括分号在错误中加下划线。
答
这是因为顶层期待一个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
答
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 *)
发生在我身上所有的时间。我希望OCaml语法错误有点更具表现力。 – RichouHunter
@RichouHunter我听到你的声音。我最近开始使用OCaml,并且基本上感到震惊的是,当语法错误出现时,“语法错误”是我们给出的整个错误消息。而这个缺少'in'标记的特别令人讨厌。我最近失去了10分钟追踪一个这样的错误。 –
只是一个快速的评论,感谢您,Ionut,编辑标签在https://*.com/questions/44470095/further-refining-the-signature-of-a-nested-module-in-the-signature-/44470369#44470369(我不知道在哪里把我的感谢放在其他地方,但我会在一段时间后删除此评论;-)) – Lhooq