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

削除された内容 追加された内容
Wakuna99 (会話 | 投稿記録)
編集の要約なし
編集の要約なし
4行目:
'''関数型プログラミング'''(かんすうがたプログラミング、{{lang-en-short|''functional programming''}})は、[[プログラミングパラダイム]]の一つであり、[[ソフトウェア工学]]における主にプログラムリスト作成とコード記述の分野で用いられる考え方である。一説には[[数理論理学]]の[[ラムダ計算]]をモデルにして考案されたと言われる。
 
プログラムの基本要素である値(''value'')を限りなく抽象化して、入力と出力の同時表現体にすると共にその変換式も併せ持たせたものが、ターム的に'''関数'''(''function'')と定義されている。関数は同時にパラメータ値とリターン値にも出来るので変換式の連鎖が可能である。変換式(コード)はプログラム環境(データ)に一切の影響を与えず、また一切の影響を受けない事が保証されている。プログラム環境に影響を与えるコードは一般の関数と慎重に区別される。このコードとデータを完全に分離する設計が関数型プログラミングの大きな特徴である。
 
プログラムは値の宣言(''declaration'')とそれらを演算子で繋いだ式(''expression'')の連続で構成され、これが順次処理となる。値は数値、構造体、関数、関数連鎖として随時抽象化される。分岐処理は条件式とthen式とelse式を合わせた式の一形態で行なわれる事が多い。反復処理は関数の[[再帰]](''recursion'')として行なわれ、その関数内の評価(''eval'')が変わらなくなるまで繰り返される。関数型プログラミングの流れはこの様なものである。
 
== 特徴 ==
12 ⟶ 10行目:
 
=== 第一級関数と高階関数 ===
 
=== 参照透過性 ===
 
=== 純粋関数 ===
 
=== 厳格評価と遅延評価 ===
 
=== 型推論 ===
 
=== 再帰 ===
たとえば、1 から 10 までの整数を足し合わせるプログラムを考える<ref>本来は[[等差数列]]の和の公式を用いて定数時間で問題を解く方法が最適解だが、ここではプログラミングスタイルの比較のため数値計算的手法を用いる。</ref>とき、手続き型プログラミングでは以下のように[[ループ (プログラミング)|ループ]]文を使って一時変数に数値を足していく(一時変数の内容を書き換える)命令を繰り返し実行するという形を取る。
 
* [[Pascal]]による例:
<source lang="pascal">
program test;
32 ⟶ 36行目:
一方、関数型プログラミングでは、繰り返しには一時変数およびループを使わず、[[サブルーチン|関数]]の[[再帰呼び出し]]を使う。
 
* [[F Sharp|F#]]による例:
<source lang="fsharp">
printfn "%d" (let rec sum x = if x > 0 then x + sum (x - 1) else 0
49 ⟶ 53行目:
ただし再帰呼び出しは[[スタックオーバーフロー]]の危険性やオーバーヘッドを伴うため、注意深く使用しなければならない<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:検証可能性#通常は信頼できないとされる情報源]]-->
== 概要 ==
<!--関数型プログラミングではプログラムの構成にC言語のように関数を多用する<ref>The C language is purely functional http://conal.net/blog/posts/the-c-language-is-purely-functional</ref>。[[Wikipedia:検証可能性#通常は信頼できないとされる情報源]]-->関数型プログラミングでは関数を[[第一級オブジェクト]]として扱う。理論的な計算モデルとして第一級オブジェクトとしての関数を扱える[[ラムダ計算]]や[[項書き換え]]を採用している。
 
コンピュータプログラムは通例入力を受け取って何らかの処理を行ない、出力を返すことを目的として書かれる。数学の関数<math>y = f(x)</math>において、<math>x</math>を入力、<math>y</math>を出力と考えると、コンピュータプログラムはある種の関数であると考えることができる。ここで、入力や出力は記憶装置中のファイルのようなものばかりではなく、キーボードや[[ポインティングデバイス]]によってユーザーから与えられる情報や、画面への表示といった入出力形態も考えられる。関数型プログラミングにおいては実際にそれらを扱う関数としてモデル化する。