「関数型プログラミング」の版間の差分
削除された内容 追加された内容
編集の要約なし |
Goldensundown2 (会話 | 投稿記録) 編集の要約なし |
||
4行目:
'''関数型プログラミング'''(かんすうがたプログラミング、{{lang-en-short|''functional programming''}})は、[[プログラミングパラダイム]]の一つであり、[[ソフトウェア工学]]における主にプログラムリスト作成とコード記述の分野で用いられる考え方である。一説には[[数理論理学]]の[[ラムダ計算]]をモデルにして考案されたと言われる。
プログラムの基本要素である値(''value'')を限りなく抽象化して、入力と出力の同時表現体にすると共にその変換式も併せ持たせたものが、ターム的に'''関数'''(''function'')と定義されている。関数は同時にパラメータ値とリターン値にも出来るので変換式の連鎖が可能
== 特徴 ==
12 ⟶ 10行目:
=== 第一級関数と高階関数 ===
=== 参照透過性 ===▼
=== 純粋関数 ===
=== 厳格評価と遅延評価 ===
=== 型推論 ===▼
=== 再帰 ===
たとえば、1 から 10 までの整数を足し合わせるプログラムを考える<ref>本来は[[等差数列]]の和の公式を用いて定数時間で問題を解く方法が最適解だが、ここではプログラミングスタイルの比較のため数値計算的手法を用いる。</ref>とき、手続き型プログラミングでは以下のように[[ループ (プログラミング)|ループ]]文を使って一時変数に数値を足していく(一時変数の内容を書き換える)命令を繰り返し実行するという形を取る。
*
<source lang="pascal">
program test;
32 ⟶ 36行目:
一方、関数型プログラミングでは、繰り返しには一時変数およびループを使わず、[[サブルーチン|関数]]の[[再帰呼び出し]]を使う。
*
<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:検証可能性#通常は信頼できないとされる情報源]]-->
コンピュータプログラムは通例入力を受け取って何らかの処理を行ない、出力を返すことを目的として書かれる。数学の関数<math>y = f(x)</math>において、<math>x</math>を入力、<math>y</math>を出力と考えると、コンピュータプログラムはある種の関数であると考えることができる。ここで、入力や出力は記憶装置中のファイルのようなものばかりではなく、キーボードや[[ポインティングデバイス]]によってユーザーから与えられる情報や、画面への表示といった入出力形態も考えられる。関数型プログラミングにおいては実際にそれらを扱う関数としてモデル化する。
|