2014-06-16 20 views
0

我想教自己OCaml。我一直在討論這個語法陷阱。我被告知可以使用「;」按順序將表達式串聯在一起即expr1; expr2按預期執行第一個expr,然後執行第二個expr。出於某種原因,我無法解釋與下面的輸入OCaml語法陷阱:多個讓我們使用分隔符

let x = 5 ; let y = 7;; 

奇怪的是,如果只有第一expr是一讓,它的工作原理一致。所以

let x = 5 ; 7;; 

推移,計算結果爲7 更糟的是,如果我嘗試使用括號組成的語句的多個序列,其中讓利至上,它仍然無法正常工作。 I.E .:

let x = 5 ; (let y = 7 ; 9);; 

是一個錯誤,即使它只包含讓我們是第一個表達式的序列。有人可以解釋如何讓這個工作?

回答

3

查看問題的一種方法是let x = 5不是表達式。這是一個頂層聲明;即它聲明一個名稱爲x的值爲5.

;運算符用於組合表達式,但不用於聲明。

您不需要將字符串聲明與;一起使用。你可以把一個接一個:

# let x = 5 let y = 7;; 
val x : int = 5 
val y : int = 7 
# 

有OCaml中一個完全不同使用let這是一個表達式的一部分。在這種情況下,它隨後in

# (let x = 4 in x + 1);; 
- : int = 5 

因爲這是一個表達式,可以串;在一起的幾個人:

# (let x = 4 in x + 1); (let y = 6 in y + 1);; 
Warning 10: this expression should have type unit. 
- : int = 7 

然而,由於編譯器警告你,這不是成語將任意表達式串起來。通常,您使用命令代碼使用;。使用功能代碼它沒有意義。因此,編譯器期望除最後一個表達式之外的所有其他表達式都有unit(用於執行有用但不返回有用值的命令式代碼)。

+0

瞭解!非常感謝你 –