2012-12-03 71 views
1

我正在學習Jason Hickey's Introduction to Objective Caml。只是有一個關於嵌套函數(柯里化)的問題。瞭解嵌套函數的邏輯的更好方法(柯里格)

有一個存在的問題How to understand the "Currying" in Haskell?,但我想我正在尋求一個稍微不同的問題的答案。


它說,我們可以寫let sum = fun i j -> i + j;;let sum = fun i -> fun j -> i + j;;

我的問題很簡單:

我可以理解這樣的上述定義:let sum = fun i -> i + fun j -> j;;

我知道它不會通過編譯器,但我只是試圖將這種OCaml function definition映射到mathematics functions

在我上面的想象中,我們可以輕鬆地在數學中編寫函數f(i) = i + g(j); and g(j) = j

我應該總是做這種邏輯映射以便於理解嗎?

回答

3

你的想象力並不是真的正確:f(i) = i + g(j)沒有太大的意義,j在這裏沒有定義。

要理解fun i j -> foo的正確方法是將其視爲更簡單的語法糖fun i -> fun j -> foo

所有下面的定義是完全等價的:

let sum i j = i + j 
let sum i = fun j -> i + j 
let sum = fun i -> (fun j -> i + j) 
let sum = fun i -> fun j -> i + j 
let sum = fun i j -> i + j 

let sum i = 
    let add_i = fun j -> i + j in 
    add_i 

數學上,這可以寫成(ⅰ↦(j↦I + J)),作爲 函數空間(ℕ→(ℕ→一個元件ℕ))。

1

OCaml函數可以直接映射到數學符號或從數學符號直接映射。但是,您需要認識到數學符號是不明確的。功能值f(i),特定值i和功能f本身之間沒有明確的區別。當一個意思是功能f本身時,通常會寫f(i)。 (「讓我們考慮一個函數f(i)= i + 1 ...這個函數是......」)要在OCaml中編寫正確的代碼,您必須清楚地看到您是使用函數本身還是使用值的功能。

當你在數學符號說,「考慮功能f(i,j)=i+g(j) where g(j)=j,你寫的函數值。在OCaml中,這被翻譯成

let f i j = 
     let g j = j in 
     i + g j;; 

let f = 
    let g = fun j -> j 
    in 
    fun i j -> i + g j;; 

如果您正在嘗試寫let sum = fun i -> i + fun j -> j;;,那麼在數學表示法中,您會說「考慮函數sum,使得sum(i) = i + g,其中g是由g(j)=j定義的函數。「這在數學上是不正確的:你不能添加整數值i功能g只能添加一個整數i和功能g對其他一些整數j的表達。」 i+g「是undefined,嚴格來說,要麼寫i + g(i)i+g(j),而要寫i+g,這在數學上是如此,在OCaml中也是這樣的,