我正在OCaml做一個學校任務,我對錶達的含義有疑問。什麼是(int - > int) - >(int - > int)是什麼意思?
當定義功能,如果我舉個例子,寫道:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
是什麼(int -> int)
意思?我明白函數本身收到一對作爲參數,但我不完全明白括號是什麼意思...
我正在OCaml做一個學校任務,我對錶達的含義有疑問。什麼是(int - > int) - >(int - > int)是什麼意思?
當定義功能,如果我舉個例子,寫道:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
是什麼(int -> int)
意思?我明白函數本身收到一對作爲參數,但我不完全明白括號是什麼意思...
括號用於消除類型爲(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
查找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
)或者接受一對int
和int -> int
類型的函數作爲參數的應用程序(可以將其寫入作爲int * (int -> int)
)。
如果你解釋說在這個沒有括號的情況下,你的解釋可能是好的,函數會在整數上期望一對並返回一個類型爲「int - >」的函數int - > int'因爲'*'在' - >'上具有更高的優先級。 – Lhooq
應用'(INT - > INT)'是函數從'int'到'int'類型。 – gallais
@gallais這並沒有真正幫助很多。 – PieOhPah
目前還不清楚你在問什麼...... – gallais