| FP | |
|---|---|
| パラダイム | 機能レベル |
| デザイン: | ジョン・バッカス |
| 初登場 | 1977 (1977年) |
| 方言 | |
| FP84 | |
| 影響を受けた | |
| APL [ 1 ] | |
| 影響を受けた | |
| FL、ハスケル、ジョイ | |
FP(function programming)[ 2 ]は、ジョン・バッカスによって関数レベルプログラミング[ 2 ]パラダイムをサポートするために作成されたプログラミング言語です。FPは、一般的に有用な言語プリミティブのセットからプログラムを構築し、名前付き変数を避けることができます(このスタイルは暗黙的プログラミングまたは「ポイントフリー」とも呼ばれます)。FPは、1960年代初頭にケネス・E・アイバーソンによって開発されたAPLから大きな影響を受けています。 [ 3 ]
FP言語は、1977年のバッカスによるチューリング賞論文「プログラミングはフォン・ノイマン型から解放されるか?:関数型スタイルとそのプログラム代数」で導入されました。この論文は関数型プログラミング研究への関心を呼び起こし、[ 4 ]最終的には、バッカスが期待した関数レベルのパラダイムではなく、主にラムダ計算パラダイムに基づく現代の関数型言語へとつながりました。チューリング賞論文の中で、バッカスはFPスタイルがどのように異なるかを説明しています。
FPシステムは、関数型と呼ばれる固定された結合形式の集合に基づいています。これらと簡単な定義は、既存の関数から新しい関数を構築する唯一の手段です。関数型は変数や置換規則を必要とせず、関連するプログラム代数における演算となります。FPシステムのすべての関数は単一の型、つまりオブジェクトをオブジェクトにマッピングし、常に単一の引数を取ります。[ 2 ]
FPは学術界以外ではほとんど使われなかった。[ 5 ] 1980年代に、BackusはIBM Researchの内部プロジェクトとして後継言語であるFLを作成した。
FP プログラムが相互にマッピングする値は、シーケンス形成に関して閉じたセットを構成します。
x 1 ,..., x nが値ならば、列〈x 1 ,..., x n〉 も値である。
これらの値は、ブール値、整数、実数、文字などの任意のアトムのセットから構築できます。
ブール値 : { T , F } 整数 : {0,1,2,...,∞} 文字 : {'a','b','c',...} シンボル : { x , y ,...} ⊥は未定義値、つまり底辺を表します。シーケンスは底辺を保持します。
〈x 1 ,..., ⊥ ,..., x n〉 = ⊥
FP プログラムは、それぞれ単一の値x を別の値にマッピングする関数fです。
f : xは関数fを値x に適用した結果の値を表す。
関数はプリミティブ(つまり、FP 環境で提供される)であるか、プログラム形成操作によってプリミティブから構築されます(関数とも呼ばれます)。
プリミティブ関数の例としては、定数関数 x̄があり、これは値xを定数値関数x̄に変換します。関数は厳密です。
f : ⊥ = ⊥
プリミティブ関数のもう 1 つの例は、 1、2、... で表されるセレクタ関数ファミリです。
i :〈 x 1 ,..., x n〉 = x i (1 ≤ i ≤ n の = ⊥ それ以外の場合
原始関数とは対照的に、関数は他の関数に対して作用します。例えば、加算の場合は0、乗算の場合は1のように、関数の中には単位値を持つものがあります。関数単位は、単位値を持つ関数 f に適用すると、そのような値を生成します。
単位 + = 0 単位 × = 1 単位 foo = ⊥
これらは FP のコア機能です。
合成f ∘ g ただし f ∘ g : x = f :( g : x )
構文[ f 1 ,..., f n ] ただし [ f 1 ,..., f n ]: x = 〈f 1 : x ,..., f n : x〉
条件( h ⇒ f ; g ) ただし ( h ⇒ f ; g ): x = f : xの場合h : x = T = g : x の場合 h : x = F = ⊥の 場合 それ以外の場合
すべてに適用α f ただし α f :〈x 1 ,..., x n〉 = 〈f : x 1 ,..., f : x n〉
insert-right / f ただし / f :〈x〉 = x かつ / f :〈x 1 , x 2 ,..., x n〉 = f :〈x 1 ,/ f :〈x 2 ,..., x n〉〉 および / f :〈 〉 = 単位 f
左挿入 \ f ただし \ f :〈x〉 = xかつ \ f :〈x 1 , x 2 ,..., x n〉 = f :〈\ f :〈x 1 ,..., x n-1〉, x n〉 そして \ f :〈 〉 = 単位 f
関数は、関数によってプリミティブから構築されるだけでなく、方程式によって再帰的に定義することもできます。最も単純なものは次のとおりです。
f ≡ E f
ここで、E fは、関数を使用して、プリミティブ、他の定義済み関数、および関数シンボルfのみから構築された式です。
FP84 はFP の拡張であり、無限シーケンス、プログラマ定義の結合形式(Backus がFP の後継であるFLに追加したものに類似)、遅延評価が含まれます。Backus 独自の FP のバリエーションの 1 つである FFP とは異なり、FP84 ではオブジェクトと関数が明確に区別されています。つまり、後者は前者のシーケンスでは表現されません。FP84 の拡張は、シーケンス構築が-⊥以外のオブジェクトにのみ適用されるという FP の制限を削除することによって可能になります。FP84 では、式の全宇宙 (意味が ⊥ であるものも含む) がシーケンス構築の 下で閉じられています。
FP84 のセマンティクスは、プログラムの基本的な代数、つまりプログラムを操作したり推論したりするために使用できる 関数レベルの等式の集合に具体化されています。