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

削除された内容 追加された内容
編集の要約なし
Wakuna99 (会話 | 投稿記録)
編集の要約なし
11行目:
何をもって関数型プログラミングとするか、ということに関して、関数型プログラミングのコミュニティ内でも正確な定義や合意というものは存在しない。したがって関数型言語の定義も明確な境界はない。ただし、[[手続き型プログラミング]]が命令実行の列としてプログラムを記述していくのに対し、関数型プログラミングは複数の式を関数の適用によって組み合わせていくプログラミングスタイルである<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>とき、手続き型プログラミングでは以下のように[[ループ (プログラミング)|ループ]]文を使って一時変数に数値を足していく(一時変数の内容を書き換える)命令を繰り返し実行するという形を取る。
 
49行目:
ただし再帰呼び出しは[[スタックオーバーフロー]]の危険性やオーバーヘッドを伴うため、注意深く使用しなければならない<ref>[https://msdn.microsoft.com/ja-jp/library/dd233229(v=vs.120).aspx 関数 (F#) | MSDN]</ref>。通例、関数型言語では、[[末尾再帰]]呼び出し (tail-recursive call) の形で書かれた関数をループに展開する[[コンパイラ最適化]]により、スタックオーバーフローの危険性および再帰のオーバーヘッドを解消する。[[Scheme]]など、関数型言語の中には末尾再帰呼び出しの最適化を仕様で保証するものもある。
 
==== 厳格評価と遅延評価 ====
 
==== 型推論 ====
 
==== 参照透過性 ====
 
==== データ構造体 ====
 
==== ファンクタ、モナド、アプリカティブ ====
 
== 概要 ==