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 
+0

发生在我身上所有的时间。我希望OCaml语法错误有点更具表现力。 – RichouHunter

+0

@RichouHunter我听到你的声音。我最近开始使用OCaml,并且基本上感到震惊的是,当语法错误出现时,“语法错误”是我们给出的整个错误消息。而这个缺少'in'标记的特别令人讨厌。我最近失去了10分钟追踪一个这样的错误。 –

+0

只是一个快速的评论,感谢您,Ionut,编辑标签在https://*.com/questions/44470095/further-refining-the-signature-of-a-nested-module-in-the-signature-/44470369#44470369(我不知道在哪里把我的感谢放在其他地方,但我会在一段时间后删除此评论;-)) – Lhooq

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 *)