「関数型プログラミング」の版間の差分

削除された内容 追加された内容
編集の要約なし
編集の要約なし
1行目:
{{独自研究|date=2014年4月}}
{{プログラミング言語|index=かんすうかたけんこ}}
[[ファイル:Orange_lambda.svg|リンク=https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Orange_lambda.svg|代替文=|境界|右|フレームなし|167x167ピクセル]]
'''関数型プログラミング言語'''({{lang-en-short|''functional programming language''}})は、関数型プログラミングの[[プログラミングパラダイム|パラダイム]]を扱う[[プログラミング言語]]の総称である。本稿ではそのパラダイムについても説明する。'''純粋関数型'''(''purely functional'')と'''非純粋関数型'''(''impure functional'')の二つに大別され、後者の方が幅広く用いられている。[[マルチパラダイムプログラミング言語|マルチパラダイム言語]]に組み込まれているものは例外なく非純粋であり、関数型パラダイムの一部分をかいつまんだものと考えてよい。
 
'''関数'''とは与えられた入力値から任意の出力値を導き出す変換式を意味する。関数はそれ自体が値として扱われるので前述の入力値または出力値にする事もできる。関数を値として扱える関数の仕組みは[[高階関数]](''higher-order function'')、値そのものとして扱われる関数の仕組みは[[第一級関数]](''first-class function'')と呼ばれる。非純粋関数型はほとんどこの高階関数と第一級関数の構文仕様に着目したものである。純粋関数型はイメージ的に[[副作用 (プログラム)|副作用]](''side-effect'')をイメージ的に排除する[[参照透過性]](''referential transparency'')を中心にしたものであり、その仕様実現の為に専用のランタイム環境上でプログラムは走行される。
 
== 特徴 ==
== 関数型プログラミング ==
関数型プログラミングは[[宣言型プログラミング]](''declarative programming'')のカテゴリに属するパラダイムである。宣言型と対照的関係にあるのが[[命令型プログラミング]](''imperative programming'')であり、そのカテゴリには[[手続き型プログラミング]]と[[オブジェクト指向プログラミング]]などが属している。命令型と宣言型を分ける一つの基準は[[副作用 (プログラム)|副作用]](''side-effects'')に対する扱い方である。この「副作用」については独立項目にて後述するが、簡単に言うと現行プロセスの閉包領域の外にある、あらゆる情報資源の状態=いわゆる「環境」を指す。ここでの情報資源とは、プログラムの各種入出力(I/O)を担う[[オペレーティングシステム]]の現行状態と、プログラムを走行させている[[仮想マシン|ランタイム環境]]が提供する各種データリソースを意味する。データリソースには純粋関数型では扱いにくい動的配列と動的連想配列も含まれている。
広く認められた関数型プログラミングの正確な定義は存在しないが、関数型プログラミングと呼ばれるパラダイムは[[命令型プログラミング]]と比較してプログラムに対する見方が次のように異なる<ref name="faq">{{cite web|url=http://www.cs.nott.ac.uk/~gmh/faq.html|title=Frequently Asked Questions for comp.lang.functional|accessdate=May 14, 2015}}</ref>。
 
命令型プログラミングは「[[副作用 (プログラム)|副作用]]」に対して自由に作用を及ぼせるパラダイムであり、それが”''imperative''”の由来にもなっているが、宣言型プログラミングは作用を及ぼせる対象が、あらかじめ初期値または入力値として”''declarative''”された情報資源(=データ)のみに限られている。加えて関数型プログラミングは原則的に宣言されたデータに対しても作用を及ぼさず、他の値を導き出す為の因子として扱う。
*[[命令型プログラミング]]: プログラムは計算機の内部状態を変更する命令実行の列<ref>計算モデル1 状態モデル. 計算とは、計算機の内部状態を変えてゆくもの。(中略) 状態モデルに基づくプログラミング言語. 命令型言語. (中略) 状態を変えるための命令手順書の形式. [http://nous.web.nitech.ac.jp/individual/inuzuka/lecture/PLT/PLT07/ 犬塚信博 (2007)「プログラミング言語論 第1回 イントロダクション」名古屋工業大学]</ref>
* 関数型プログラミング: プログラムは関数とその適用の組み合わせ
 
関数型プログラミングを構成する考え方には以下のものがある。
すなわち[[命令型プログラミング]]は計算機(あるいは[[CPU]])の状態を変える命令をプログラムとして書くという見方を基礎としており、これはその発祥が計算機の命令 (instruction/command) や構造に密接にかかわっていることによる。一方、関数型プログラミングは「計算とは何か」という数学の理論を基礎にしており、関数型プログラミングがもつ[[計算モデル]]は'''関数モデル'''である<ref>計算モデル2 関数モデル. (中略) 関数モデルに基づくプログラミング言語. 関数型言語. Lisp [http://nous.web.nitech.ac.jp/individual/inuzuka/lecture/PLT/PLT07/ 犬塚信博 (2007)「プログラミング言語論 第1回 イントロダクション」名古屋工業大学]</ref>。
 
=== 参照透過性(''referential transparency'') ===
たとえば、1 から 10 までの整数を足し合わせるプログラムを考える{{efn|本来は[[等差数列]]の和の公式を用いて定数時間で問題を解く方法が最適解だが、ここではプログラミングスタイルの比較のため数値計算的手法を用いる。}}。[[命令型プログラミング]]では以下のように[[ループ (プログラミング)|ループ]]文を使って変数に数値を足していく(計算機の状態を書き換える)命令を繰り返し実行するという形を取る。
 
=== 副作用(''side-effects'') ===
 
=== データ機構(''data structures'') ===
 
=== 再帰(''recursion'') ===
 
=== 評価戦略(''evaluation strategy'') ===
 
=== 純粋関数(''pure functions'') ===
 
=== 型の体系(''type systems'') ===
 
=== 高階関数と第一級関数(''first-class and higher-order functions'') ===
 
=== その他 ===
 
== 関数型プログラミングの例 ==
関数型プログラミングは「計算とは何か」という数学の理論を基礎にしており、関数型プログラミングがもつ[[計算モデル]]は'''関数モデル'''である<ref>計算モデル2 関数モデル. (中略) 関数モデルに基づくプログラミング言語. 関数型言語. Lisp [http://nous.web.nitech.ac.jp/individual/inuzuka/lecture/PLT/PLT07/ 犬塚信博 (2007)「プログラミング言語論 第1回 イントロダクション」名古屋工業大学]</ref>。たとえば、1 から 10 までの整数を足し合わせるプログラムを考える{{efn|本来は[[等差数列]]の和の公式を用いて定数時間で問題を解く方法が最適解だが、ここではプログラミングスタイルの比較のため数値計算的手法を用いる。}}。[[命令型プログラミング]]では以下のように[[ループ (プログラミング)|ループ]]文を使って変数に数値を足していく(計算機の状態を書き換える)命令を繰り返し実行するという形を取る。
 
* [[Pascal]]による例: