「関数型プログラミング」の版間の差分
削除された内容 追加された内容
編集の要約なし |
|||
4行目:
'''関数型プログラミング言語'''({{lang-en-short|''functional programming language''}})は、関数型プログラミングの[[プログラミングパラダイム|パラダイム]]を扱う[[プログラミング言語]]の総称である。'''純粋関数型'''(''purely functional'')と'''非純粋関数型'''(''impure functional'')の二つに大別され、後者の方が幅広く用いられている。[[マルチパラダイムプログラミング言語|マルチパラダイム言語]]に組み込まれているものは例外なく非純粋である。
== 概要 ==
=== コーディング視点 ===
関数型プログラミングの基軸である関数(''function'')は、与えられた入力値から任意の出力値を導き出す変換式を意味するが、[[数理論理学]]の[[型付きラムダ計算]]がモデルにされてる背景から更に上乗せされた性質を持つ。関数はそれ自体が型付きの値として扱われており、その「関数の型」は各引数への適用から結果値までの連鎖パターンとして表現される。関数を値として扱える関数の仕組みは[[高階関数]](''higher-order function'')、値そのものとして扱われる関数の仕組みは[[第一級関数]](''first-class function'')と呼ばれる。型(''type'')を体系化しまた抽象化する仕組みは[[型システム]](''type system'')と呼ばれる。引数の値は関数になり得てそれもまた引数を持つといった連鎖は[[再帰]](''recursion'')を自然に表現する。それらの連携による計算式のスタイルが関数型プログラミングをユニークなものにしている。
このラムダ計算の論理を背景にした関数の用法を一般的な手続き型プログラミングの視点から眺めると、そこでは特に並べ方に決まりのなかった関数の「引数欄」を、関数型プログラミングの方ではその順序構成に厳格に意味を持たせた要素にして「型」の表現法に組み込んでいるのが大きな違いになる。この引数欄構造の明確な有意義化が、[[カリー化]]と合わせたラムダ計算流の式分析と、その論理に則った各種変換および各種簡約による式の再構成を可能にし、また部分適用や関数合成による式の組み換えも可能にして、式の平易化による視覚的または実際に機能的な関数アルゴリズムの最適化を実現している。
=== デザイン視点 ===
関数型プログラミングは[[宣言型プログラミング]](''declarative programming'')のカテゴリに属するパラダイムである。宣言型と対照的関係にあるのが[[命令型プログラミング]](''imperative programming'')であり、そのカテゴリには[[手続き型プログラミング]]と[[オブジェクト指向プログラミング]]などが属している。命令型と宣言型を分ける一つの基準は[[副作用 (プログラム)|副作用]](''side-effects'')に対する考え方および扱い方である。この副作用については改めて後述するが、簡潔に述べると現行プロセスの閉包領域の外にある様々な情報資源の状態=いわゆる「環境」の変化と、その変化によって各プロセスの処理過程もまた影響を受ける事を指す。ここでの情報資源とは、プログラムの各種入出力(I/O)を担う[[オペレーティングシステム]]の現行状態と、プログラムを走行させている[[仮想マシン|ランタイム環境]]が提供する各種データリソースを意味する。データリソースには純粋関数型では扱いにくい動的配列と動的連想配列も含まれる。
24 ⟶ 31行目:
=== 型の体系(''type system'') ===
===
===
== 歴史 ==
|