2012-10-25 67 views
3

在標準ML,是什麼(我省略開始=定義)以下聲明的區別:標準ML中函數聲明`f x y`和`f(x,y)`之間的區別是什麼?

fun f x y; 

fun f (x, y); 

據我瞭解,第一個採用兩個參數,而第二個需要一個元組。如果是這樣的話,那麼使用一種與另一種相比,(實際的)含義又是什麼?一個論點是最好的風格嗎?假設,一個實際上並不需要使用元組作爲整體的,即只xy,分別,是相關的。

回答

5

是的,如你所說,第一個以「兩個參數」,而第二個接受一個參數是一個元組。但是,要了解真正發生了什麼,您必須瞭解柯里爾。在ML中,每個「函數」只需要一個參數(不多也不少)。

在第二種情況下,這是很容易理解,它需要一個參數,它是一個元組,而它與事物的東西在元組,並返回結果。在第一種情況下,您正在定義一個帶有一個參數的函數,然後返回一個帶另一個參數的函數,然後返回結果。

例如說,這是一個函數,它需要兩個int s並返回一個int。查看這兩個函數的類型是有益的:第二個函數的類型是(int * int) -> int,即從元組到int的函數。第一個函數的類型是int -> int -> int,它自->是右關聯的,可以解析爲int -> (int -> int)。所以你可以看到,它需要一個int並返回一個函數。語法fun f x y = ...是更詳細的val f = fn x => fn y => ...的語法糖。當您應用此功能時,例如f 3 4,功能應用是左結合的,所以它實際上是(f 3) 4,所以你可以看到它是如何工作:f需要一個int,然後返回被應用到另一個INT功能。這是咖喱的主旨。 ML的語法只是讓它透明。

咖喱版(第一版)允許你做部分申請。這意味着,雖然你的函數在概念上有兩個參數,但你不必給它那麼多的參數。所以f 3 4我們上面(這是(f 3) 4),如果我們只是拿了f 3,而不是僅僅將其應用於4,只是不停地並將其存儲在一個變量還是什麼?通過「給函數少於它想要的參數」,我們自動獲得一個函數,它接受剩下的參數。例如,我們可以執行map (f 3) someList,它將爲列表中的每個x計算一個列表f 3 x,而不必編寫一些複雜的語法。

在標準ML,庫函數大多在uncurried形式;而在OCaml和Haskell中,它們大多處於咖喱狀態。 (請參閱this question。)但是,高階函數(如map和fold)的SML庫函數傾向於將它們的函數參數放在單獨的(curried)參數中。

相關問題