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

削除された内容 追加された内容
編集の要約なし
編集の要約なし
タグ: Refタグつき記述の除去 ビジュアルエディター
4行目:
'''関数型プログラミング'''(かんすうがたプログラミング、{{lang-en-short|''functional programming''}})は、[[プログラミングパラダイム]]の一つであり、[[ソフトウェア工学]]における主にプログラムリスト作成とコード記述の分野で用いられる考え方である。一説には[[数理論理学]]の[[ラムダ計算]]をモデルにして考案されたと言われる。
 
ここでの'''関数'''(''function'')とは、入力値を変換式に与えて出力値を導き出す仕組みのプログラム構文を指す。関数型プログラミングの世界では、大局的にはコード(変換式)とデータ(値)が完全に分離されている。実行中におけるプログラム環境の変化は副作用(''side-effect'')と呼ばれ、この副作用に関する一切の情報はデータ側に蓄積されてコード側は保有しない。またデータは生成されるのみで変化する事はない。変換式に与えられた入力値に次の副作用を加えて新たに生成された出力値を、再帰的に変換式に与え続けて最終的な最適解の最終値を得るのが、関数型プログラミングの基本的な流れとなる。
 
== 特徴 ==
何をもって関数型プログラミングとするか、ということに関して、関数型プログラミングのコミュニティ内でも正確な定義や合意というものは存在しない。したがって関数型言語の定義も明確な境界はない。ただし、[[手続き型プログラミング]]が命令実行の列としてプログラムを記述していくのに対し、関数型プログラミングは複数の式を関数の適用によって組み合わせていくプログラミングスタイルである<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) や構造に密接にかかわりがある一方、関数型プログラミングは数学の理論を発端としている。
 
=== 第一級関数と高階関数 ===
 
=== 純粋関数 ===
 
=== 参照透過性 ===
 
=== データストラクチャ情報構造体 ===
 
=== 型論 ===
 
=== 評価戦略 ===
 
=== 再帰 ===
たとえば、1 から 10 までの整数を足し合わせるプログラムを考える<ref>本来は[[等差数列]]の和の公式を用いて定数時間で問題を解く方法が最適解だが、ここではプログラミングスタイルの比較のため数値計算的手法を用いる。</ref>とき、手続き型プログラミングでは以下のように[[ループ (プログラミング)|ループ]]文を使って一時変数に数値を足していく(一時変数の内容を書き換える)命令を繰り返し実行するという形を取る。
 
=== 評価戦略 ===
*[[Pascal]]による例:
<source lang="pascal">
program test;
var total, i : Integer;
begin
total := 0;
for i := 1 to 10 do
total := total + i;
WriteLn(total)
end.
</source>
 
=== 第一級関数と高階関数 ===
一方、関数型プログラミングでは、繰り返しには一時変数およびループを使わず、[[サブルーチン|関数]]の[[再帰呼び出し]]を使う。
 
=== 純粋関数 ===
*[[F Sharp|F#]]による例:
<source lang="fsharp">
printfn "%d" (let rec sum x = if x > 0 then x + sum (x - 1) else 0
sum 10)
</source>
<!--
<source lang="haskell">
let
sum x = if x == 0 then 0
else x + sum (x - 1)
in
sum 10
</source>
-->
 
=== 束縛変数と自由変数 ===
ただし再帰呼び出しは[[スタックオーバーフロー]]の危険性やオーバーヘッドを伴うため、注意深く使用しなければならない<ref>[https://msdn.microsoft.com/ja-jp/library/dd233229(v=vs.120).aspx 関数 (F#) | MSDN]</ref>。通例、関数型言語では、[[末尾再帰]]呼び出し (tail-recursive call) の形で書かれた関数をループに展開する[[コンパイラ最適化]]により、スタックオーバーフローの危険性および再帰のオーバーヘッドを解消する。[[Scheme]]など、関数型言語の中には末尾再帰呼び出しの最適化を仕様で保証するものもある。
 
== 概要 ==<!--関数型プログラミングではプログラムの構成にC言語のように関数を多用する<ref>The C language is purely functional http://conal.net/blog/posts/the-c-language-is-purely-functional</ref>。[[Wikipedia:検証可能性#通常は信頼できないとされる情報源]]-->