§ 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)とみなされます.