簡體   English   中英

(int-> int)->(int-> int)是什么意思?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM