我不知道如何正確地通過這個函數並確定它的類型。我將它打入OCaml頂層,輸出結果爲「hello world」,但我不知道爲什麼。有人能解釋他們如何確定最終產出?謝謝!OCaml中這個函數是如何/爲什麼是合法的?另外,我將如何去檢查像這樣的陳述在將來是否合法?
let f y =
let z = (let x = 5 in y * x) + y in "hello" in (f 7)^" world"
我不知道如何正確地通過這個函數並確定它的類型。我將它打入OCaml頂層,輸出結果爲「hello world」,但我不知道爲什麼。有人能解釋他們如何確定最終產出?謝謝!OCaml中這個函數是如何/爲什麼是合法的?另外,我將如何去檢查像這樣的陳述在將來是否合法?
let f y =
let z = (let x = 5 in y * x) + y in "hello" in (f 7)^" world"
好了,整個事情是基於OCaml的構建let a = b in c
。如果您匹配let
和in
對,您可以看到表達式的結構。
let f y =
let z = (let x = 5 in y * x) + y
in "hello"
in (f 7)^" world"
本質f
是做一些無用的計算,然後返回「你好」的功能。
更新
這段代碼有兩個略有不同的let a = b in c
用途。也許它會更清楚地分別解釋它們。
以下:
let y = expr1 in expr2
定義了一個新的名字y
與由expr
給定的值。名稱y
然後可以在expr2
中使用。
以下:
let f x = expr1 in expr2
定義了一個函數f
。定義expr1
通常會使用參數x
來計算一個有趣的值。然後可以在expr2
中調用功能f
。
您的代碼有第一個構造(定義值z
和x
)和第二個構造(定義功能f
)之一的兩個實例。
此功能是專門混淆,所以讓我們仔細地搬過來的削減步驟:
let f y =
let z = (let x = 5 in y * x) + y in "hello" in (f 7)^" world"
==>
let f y =
let z = y * 5 + y in "hello" in (f 7)^" world"
==>
let f y =
let z = y * 5 + y in "hello" in (f 7)^" world"
在這一點是顯而易見的,那z
在功能f
不用,讓我們將其刪除:
let f y = "hello" in (f 7)^" world"
我們可以看到,實際上我們有「函數」f
,總是返回「hello」:
let f y = "hello"
這是在表達式(f 7)^" world"
的範圍內定義的。 f 7
評估爲"hello"
,我們有"hello world"
。
的
let <name> = <expr-1> in <expr-2>
具有評價的規則如下:
<expr-1>
<name>
每個自由出現在<expr-2>
與<expr-1>
<expr-2>
「in」關鍵字有什麼作用?如果我錯了,Im新到ocaml如此糾正我,但對於我,in關鍵字以「hello」作爲函數的起始輸入z – AndroidNewbie 2015-02-23 16:53:26
「in」關鍵字與先前的let關鍵字匹配。沒有函數'z',z只是一個值。 – 2015-02-23 16:55:12
謝謝你的澄清 – AndroidNewbie 2015-02-23 17:03:44