関数束縛
関数束縛なんて以下略。文法は「let fname p0 p1 p2 ... = expr」です。
# let f n = n + 3;; val f : int -> int = <fun> # f 4;; - : int = 7
fは整数型を引数に取り、整数型を返す関数です、みたいな感じの解釈でいいんだと思います。
ここでも型推論ちゃんとしてて偉いですね。
curry化とかまあ説明するのめんどくさいので適当ですが、まあつまり、こういうことができます。
# let g x y = x + y;; val g : int -> int -> int = <fun> # let f x = g x;; val f : int -> int -> int = <fun>
関数fは「整数型の引数を一つとり、『整数型の引数を一つ取り整数型を返す関数』を返す関数」になります。
何かややこしいですが、つまり以下の二つの関数呼び出しは同義、ということになります。
(嘘です。ほんとは内部で行われてる処理が違うかもしれません。まあ使う分には同じです)
# f 1 2;; - : int = 3 # g 1 2;; - : int = 3
というか、fのような関数を定義しなくても、以下のような呼び出しが普通に合法です。
# g 1;; - : int -> int = <fun> #
勿論これも、「f 1」と同義です。すごーい。えらーい。
(嘘です以下略)