2017-10-13 356 views
0

我正在OCaml做一個學校任務,我對錶達的含義有疑問。什麼是(int - > int) - >(int - > int)是什麼意思?

當定義功能,如果我舉個例子,寫道:

let iter : int * (int -> int) -> (int -> int) 
= fun (n,f) -> 

是什麼(int -> int)意思?我明白函數本身收到一對作爲參數,但我不完全明白括號是什麼意思...

+0

應用'(INT - > INT)'是函數從'int'到'int'類型。 – gallais

+1

@gallais這並沒有真正幫助很多。 – PieOhPah

+0

目前還不清楚你在問什麼...... – gallais

回答

4

括號用於消除類型爲(int -> int)的函數之間的歧義 - 這意味着它需要一個參數鍵入int並返回一個int - 可能只是兩個常規int s作爲該函數的參數。例如,如果沒有第一對圓括號,則iter將預期爲(int, int)元組,並且在沒有其他參數存在的情況下,期望int -> int -> int作爲返回類型。

請注意,第二對括號不是嚴格必要的,但它可以是一個很好的指示器,表示您期待函數的回報。如果沒有這一對括號,函數可以被讀取爲期望一個(int, int -> int)的元組加上另一個int,例如返回一個int

具有相同簽名爲您iter函數的例子可能是:

let random_func: int * (int -> int) -> (int -> int) = 
    fun (n, f) -> f 
1

查找TL; DR以下。

在lambda微積分中(請耐心等待),這是ML語言的根源,核心思想是抽象應用程序或將函數映射到參數。 只有一個參數

λx[x + 1] 

在上述的λ讀取抽象功能x + 1到等待值x的應用程序,從改變保護它,並應用(與值的函數替換x和計算)

OCaml中上述將相當於:

fun x -> x + 1 

其具有類型int -> int,或輸入類型int和輸出類型int。現在,lambda每次只處理一個參數。它如何與多個參數一起使用,如x*x -2*x + c(多項式函數x2 − 2·x + c)?它像以前一樣一次評估一個參數。

λc[λx[x*x - 2*x + c]] 

因此,前一個應用程序的輸出成爲下一個輸入,依此類推。OCaml的等效將是

fun c x -> (x * x) - (2 * x) + c 

該函數具有鍵入int -> int -> int(int -> int) -> int(輸入的鏈 - >輸出)如果應用部分的功能的自變量x = 3,會得到一個簡化功能,如下所示:

fun c 3 -> (3 * 3) - (2 * 3) + c 
fun c -> 9 - 6 + c 
fun c -> 3 + c 

,其中得到的函數將具有類型int -> int。這是咖啡的基礎。它起初可能看起來很混亂,但它在命令式語言中被證明是非常有用和不受重視的。舉例來說,你可以做這樣的事情:

let waiting_for_c_and_x = fun c x -> 2*x + c 
let waiting_for_c = waiting_for_c_and_x 10 in 
    let result = waiting_for_c 2 (* result = 22 *) 

TL; DR

但是,使用括號組輸入這些鏈/輸出棘手,但在Ocaml程序編寫必要的,因爲在現實中,編譯器不能從例如猜測int * int -> int如果您的意思是接受int * int對作爲輸入並將int作爲輸出(我們可以將其加入爲(int * int) -> int)或者接受一對intint -> int類型的函數作爲參數的應用程序(可以將其寫入作爲int * (int -> int))。

Stanford Encyclopedia of Philosophy (very good read)

+0

如果你解釋說在這個沒有括號的情況下,你的解釋可能是好的,函數會在整數上期望一對並返回一個類型爲「int - >」的函數int - > int'因爲'*'在' - >'上具有更高的優先級。 – Lhooq

相關問題