2014-10-09 41 views

回答

7

這個表達式之後沒有必要在一個半列中,但是作爲一個語法禮貌它在這裏是允許的。在這個例子中,你引用了,有一個semicolumn,因爲之後有第二個表達式。

本質上,您可以將一個半列視爲一個二元運算符,它使用兩個單位表達式,從左到右執行它們並返回一個單位。

val (;): unit -> unit -> unit 

那麼以下例子會更容易理解:

for i = 1 to 5 do 
    printf "Hello, "; 
    printf "world\n" 
done 

這裏;作品只是一個膠水。允許在第二個表達式之後加上;,但只能作爲語法糖,不過是編譯器開發人員的禮貌。

如果打開OCaml的編譯器,你會看到一個分析器定義,一個seq_expr內的表達可以通過semicolumn結束:

seq_expr: 
    | expr  %prec below_SEMI { $1 } 
    | expr SEMI      { reloc_exp $1 } 
    | expr SEMI seq_expr   { mkexp(Pexp_sequence($1, $3)) } 

這意味着,你甚至可以寫出這樣奇怪的代碼:

let x = 2 in x; let y = 3 in y; 25 
+0

雖然(警告10:此表達式應該有類型單位),但您的最後一個示例不會在沒有警告的情況下進行編譯。預計序列中的每個表達式(除了最後一個)都是單位類型的。 – 2014-10-09 20:38:29

+0

它編譯,它只是警告,說,你做錯了什麼。編譯器對此是真實的。因爲在語義上它是無稽之談。我只是向你演示語法功能。使用半列,在語法上,您可以分隔任何表達式,但如果它們沒有單位類型,那麼您將收到警告。 – ivg 2014-10-09 20:55:00

+0

是的,我知道。我只是認爲你的答案值得一提。 – 2014-10-09 21:20:16