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つの入力を受け取るので、そうではありません。
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つの入力を受け取るので、そうではありません。
この関数 (SML の他の関数と同様) は、カリー化により、実際には1 つの入力を受け取ります。
技術的には、 int を取る関数を返す 'a を取る関数を返す unit を取る関数があります。
そう
fun foo a b = a + b;
は単なる構文糖衣です
fun foo a = fn b => a + b;
等々。
関数を次のように定義した場合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 ()
。