プログラミング言語SML#解説 4.0.0版
7 MLプログラミング入門

7.9 関数適用の文法

powerUncurryは,複数引数を取るC言語の関数と同様です. ML言語の強みは,これ以外に,powerCurryにように 引数を順番に受け取る関数が書けることです. これを正確に理解するために,ここでMLの関数式の構文を復習しておき ましょう. 数学などの式では関数の利用(適用)は,関数の引数を括弧でかこみ f(x)のように記述しますが,MLなどラムダ計算の考え方を基礎とした関数型言 語では,単に関数と引数を並べてf xのように書きます.

式の集合をexprで表すと,定数,変数,関数適用を含むMLの構文は一 部は,以下のような文法となります.

expr  ::= c (定数)
 | x (変数)
 | expr expr (関数適用)
 |  その他の構文

この構文規則のみでは関数適用式が続いた場合,その適用順番をきめる ことができません. 例えば,式に割り算の構文expr/exprと足し算 expr+expr を導入した場合を考えてみましょう. この文法は,60 / 6 / 2 + 1のような式をゆるしますが,どの割り算 が先に行われるのかで2通りの解釈が可能です. この算術式では,通常左から括弧があるとみなし,((60 / 10) / 2) + 1 と解釈されます. このような解釈を,割り算の構文は「左結合」し,かつ足し算の構文より「結 合力が強い」,と言います.

ラムダ計算を下敷きとした関数適用をもつ言語では,関数適用式に関し て以下の重要な約束があります.

関数適用式は左結合し,その結合力は最も強い

関数式は左結合すると約束されているので,powerCurry 2 3((powerCurry 2) 3)と解釈されます. 一般に,e1 e2 e3  enと書いた式は ( ((e1 e2) e3)  en)とみなされます.