[英]What does (int -> int) -> (int -> int) mean?
我正在OCaml進行學校作業,並且對表達的含義有疑問。
例如,在定義函數時,如果我寫道:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
(int -> int)
是什么意思? 我知道函數本身接受一對作為參數,但我不完全理解括號的含義...
括號在這里可以區分類型(int -> int)
的函數-意味着它接受int
類型的參數並返回int
可能僅將兩個常規int
用作該函數的參數。 例如,如果沒有第一對括號,則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。
在ML語言所基於的lambda演算(請多多包涵)中,核心思想是關於抽象應用程序或將函數映射到參數。 只有一種說法 。
λx[x + 1]
上面的λ
將抽象函數x + 1
讀入應用程序中,等待x
的值,防止其更改,然后應用(將x
替換為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)
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.