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

編集の要約なし
'''関数型プログラミング'''(かんすうがたプログラミング、{{lang-en-short|''functional programming''}})は、[[プログラミングパラダイム]]の一つであり、[[ソフトウェア工学]]における主にプログラムリスト作成とコード記述の分野で用いられる考え方である。[[数理論理学]]の[[ラムダ計算]]を起源にして考案された。
 
プログラムデータの構成要素である値(''value'')を限りなく抽象化して、入力と出力の同時表現体すると共にその変換式も併せ持たせており、これがターム的に'''関数'''(''function'')と定義されている。関数は同時に入力の引数と出力の関数参照にもなるので演算の連鎖が可能であり、この仕組みの能動側は'''[[高階関数]]'''(''high-order'')、受動側は'''[[第一級関数]]'''(''first-class'')と呼ばれている。変換式はプログラムデータに一切の影響を与えず、また一切の影響を受けない事が保証されており、この原則は'''[[参照透過性]]'''(''referential transparency'')と定義され、仕組み的には'''純粋関数'''(''pure'')と呼ばれている。このコードとデータを完全に分離する設計が関数型プログラミングの大きな特徴である。値は関数の他に'''[[構造体]]'''(''data structure'')としても抽象化され、これも関数の引数または返値となる。
 
プログラムは値の宣言(''declaration'')とそれらを演算子で繋いだ式(''expression'')の連続で構成され、これが順次処理となる。値は数値、構造体、関数、関数連鎖に随時抽象化される。分岐処理は一般に条件式を引数にしてthen式またはelse式のどちらかを引数にする関数参照を返す'''[[無名関数]]'''(''anonymous function'')形態で行なわれる事が多い。反復処理は関数の'''[[再帰]]'''(''recursion'')として行なわれる。再帰はその関数内の評価(''eval'')が変わらなくなるまで繰り返される。これらの特徴を持ったものが関数型プログラミングと見なされる。
 
== 実例 ==
== 関数型プログラミング ==
何をもって関数型プログラミングとするか、ということに関して、関数型プログラミングのコミュニティ内でも正確な定義や合意というものは存在しない。したがって関数型言語の定義も明確な境界はない。ただし、[[手続き型プログラミング]]が命令実行の列としてプログラムを記述していくのに対し、関数型プログラミングは複数の式を関数の適用によって組み合わせていくプログラミングスタイルである<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>。手続き型プログラミングの発端は計算機の命令 (instruction/command) や構造に密接にかかわりがある一方、関数型プログラミングは数学の理論を発端としている。
 
21世紀に入ると、[[Java仮想マシン|{{lang|en|Java}}仮想マシン]]や[[共通言語基盤]]({{lang|en|CLI}})をランタイムとする関数型プログラミング言語を実装しようという動きが現れ、{{lang|en|[[Scala]]}}・{{lang|en|[[Clojure]]}}・{{lang|en|[[F Sharp|F#]]}}などが登場した。
 
== 代表的な関数型プログラミング言語一覧 ==
{|class="wikitable sortable"
!言語
従来の手続き型と分類されるプログラミング言語においても、関数型プログラミングを行ないやすくなる機能を備えているものもある。[[C言語]]および[[C++]]は[[関数へのポインタ]]をサポートし、関数をオブジェクトのように扱うことができるが、関数ポインタによって[[第一級関数]]をサポートしているとみなされてはいない。なお、C# 3.0、[[C++11]]、Java 8など、後発の規格においてラムダ式([[無名関数]])をサポートするようになった言語もある。
 
=== '''その他の関数型プログラミング的性質を持つ言語 ==='''
 
* {{lang|en|[[APL]]}}
* {{lang|en|[[XSL Transformations|XSLT]]}}
1,463

回編集