「関数型言語」の版間の差分

編集の要約なし
(→‎歴史: 仮リンク除去*1)
 
== 関数型プログラミング ==
何をもって関数型プログラミングとするか、関数型プログラミングを行っているコミュニティ内でも正確な定義や合意というものは存在しないが、一般的には、[[手続き型プログラミング]]がコマンド実行の列としてプログラムを記述していくのに対し、関数型プログラミングは複数の式を関数の適用によって組み合わせていくプログラミングスタイルである、ということは広く認められている。<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>
 
たとえば、手続き型プログラミングでは 1 から 10 までの整数を足し合わせるプログラムは、以下のように一時変数に数値を足していくコマンドの繰返し実行という形を取るのが一般的である:
 
<source lang=pascal>
</source>
 
一方、関数型プログラミングでは、同じプログラムを一時変数を使わずに関数の再帰呼出しを使い、全体として一つの式として書くことが多いできる:
 
<source lang=haskell>
</source>
 
関数型言語は関数型プログラミングを推奨しやい言語であが、多くの場合、手続き型プログラミングを用いたプログラムを書くことは可能であるし、逆に手続き型言語を使って関数型プログラミングを行うことも可能である。
たとえば、C言語は関数から成り立つ言語である。関数の中身は、関数型プログラミングでも記述できるが、手続き型プログラミングでも記述できる。
逆に手続き型言語を使って関数型プログラミングを行うことも可能である。
 
== 概要 ==
関数型プログラミングではプログラムの構成にC言語のように関数を多用するため、ほとんどの関数型言語プログラミングでは関数を[[第一級オブジェクト]]として扱い、そのう。理論的な計算モデルとして第一級オブジェクトとしての関数を扱える[[ラムダ計算]]や[[項書き換え]]を採用している。
 
関数への引数がプログラムへの入力で、関数を引数に作用させて評価して得られる値がプログラムからの出力であるとすると、コンピュータプログラムはある種の関数であると考えることができる。ここで、入力や出力は記憶装置中のファイルのようなものばかりではなく、マウスの動きの情報といった入力や、画面への表示といった出力も考えられ、関数型プログラミングにおいては実際にそれらを扱う関数としてモデル化する。
入力と出力以外の作用を副作用という。C言語のように関数プログラミングしやすい言語であっても、副作用が生じることを許容している。
しかし、MISRA Cコーディング標準のようにC言語の副作用を極力用いないプログラミングを推奨しているものもある。
 
コンピュータプログラムはある種の関数であると考えることができる。ここで、入力や出力は記憶装置中のファイルのようなものばかりではなく、マウスの動きの情報といった入力や、画面への表示といった出力も考えられ、関数型プログラミングにおいては実際にそれらを扱う関数としてモデル化する。
 
純粋関数型言語では、[[参照透過性]]が常に保たれるという意味において、全ての[[式 (プログラミング)|式]]や関数の評価時に[[副作用 (プログラム)|副作用]]を生まない。純粋関数型言語である{{lang|en|[[Haskell]]}}や{{lang|en|[[Clean]]}}は非正格な評価を基本としており、引数はデフォルトで[[遅延評価]]される。一方、{{lang|en|[[Idris]]}}は純粋だが正格評価を採用している。入出力などを[[参照透過性]]を保ったまま実現するために、たとえば {{lang|en|Haskell}} では[[モナド (プログラミング)|モナド]]、{{lang|en|Clean}} では{{仮リンク|一意型|en|Uniqueness type}}という特殊な型を通して一貫性のある表現を提供する。