1

SMLで次の関数が与えられます:

fun i a b = let fun j()=a+1 in j end;

関数のデータ型は次のとおりです。

val i = fn : int -> 'a -> unit -> int

理由がわかりませんかint -> 'a -> unit -> int

そして、なぜ(int * a') -> unit -> int、関数iは2つの入力を受け取るので、そうではありません。

4

2 に答える 2

2

この関数 (SML の他の関数と同様) は、カリー化により、実際には1 つの入力を受け取ります。

技術的には、 int を取る関数を返す 'a を取る関数を返す unit を取る関数があります。

そう

fun foo a b = a + b;

単なる構文糖衣です

fun foo a = fn b => a + b;

等々。

于 2013-02-16T22:39:05.857 に答える
2

関数を次のように定義した場合fun i (a,b) = ...、引数としてタプルを取り、その型は実際には になります(int * 'a) -> unit -> int。これはi (23,42) ()((23,42)がタプルであり()、単位値である) として呼び出されます。

ただしfun i a b = ...、引数を取り、次の引数を取る別の関数を返す関数を定義する として定義しました。のショートカットですfun i a = fn b => ...。として呼び出すことができますi a b ()

于 2013-02-16T22:40:37.747 に答える