2015-02-23 24 views

回答

2

好了,整個事情是基於OCaml的構建let a = b in c。如果您匹配letin對,您可以看到表達式的結構。

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

您的代碼有第一個構造(定義值zx)和第二個構造(定義功能f)之一的兩個實例。

+0

「in」關鍵字有什麼作用?如果我錯了,Im新到ocaml如此糾正我,但對於我,in關鍵字以「hello」作爲函數的起始輸入z – AndroidNewbie 2015-02-23 16:53:26

+0

「in」關鍵字與先前的let關鍵字匹配。沒有函數'z',z只是一個值。 – 2015-02-23 16:55:12

+0

謝謝你的澄清 – AndroidNewbie 2015-02-23 17:03:44

1

此功能是專門混淆,所以讓我們仔細地搬過來的削減步驟:

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> 

具有評價的規則如下:

  1. 評估<expr-1>
  2. 替代的<name>每個自由出現在<expr-2><expr-1>
  3. 評估<expr-2>
相關問題