「関数型言語」の版間の差分

提供: miniwiki
移動先:案内検索
(1版 をインポートしました)
(内容を「 '''関数型言語'''(かんすうがたげんご、{{lang-en-short|functional language}}) 数学的な言語仕様をもつプログラミング言語。式を基...」で置換)
(タグ: Replaced)
 
1行目: 1行目:
{{独自研究|date=2014年4月}}
 
{{プログラミング言語|index=かんすうかたけんこ}}
 
'''関数型言語'''(かんすうがたげんご、{{lang-en-short|functional language}})は、以下に述べる'''関数型プログラミング'''を基本スタイルとして推奨する機能を持つ[[プログラミング言語]]、関数型プログラミング言語<ref>{{lang-en-short|functional programming language}}</ref>の略称である。
 
  
== 関数型プログラミング ==
+
'''関数型言語'''(かんすうがたげんご、{{lang-en-short|functional language}}
何をもって関数型プログラミングとするか、関数型プログラミングを行っているコミュニティ内でも正確な定義や合意というものは存在しないが、一般的には、[[手続き型プログラミング]]がコマンド実行の列としてプログラムを記述していくのに対し、関数型プログラミングは複数の式を関数の適用によって組み合わせていくプログラミングスタイルである、ということは広く認められている。<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>
 
  
たとえば、手続き型プログラミングでは 1 から 10 までの整数を足し合わせるプログラムは、以下のように一時変数に数値を足していくコマンドの繰返し実行という形を取るのが一般的である:
+
数学的な言語仕様をもつプログラミング言語。式を基本的な要素とする。LISPやAPLなどがある。
  
<source lang=pascal>
+
{{テンプレート:20180815sk}}  
total = 0;
 
for i = 0 to 10 do
 
  total = total + i;
 
done;
 
</source>
 
 
 
一方、関数型プログラミングでは、同じプログラムを一時変数を使わずに関数の再帰呼出しを使い、全体として一つの式として書くことが多い:
 
 
 
<source lang=haskell>
 
let   
 
    sum x = if x == 0 then  0
 
            else  x + sum (x - 1)
 
in
 
sum 10
 
</source>
 
 
 
関数型言語とは関数型プログラミングを推奨するが、多くの場合、手続き型プログラミングを用いたプログラムを書くことは可能であるし、逆に手続き型言語を使って関数型プログラミングを行うことも可能である。
 
 
 
== 概要 ==
 
関数型プログラミングではプログラムの構成に関数を多用するため、ほとんどの関数型言語では関数を[[第一級オブジェクト]]として扱い、その理論的な計算モデルとして第一級オブジェクトとしての関数を扱える[[ラムダ計算]]や[[項書き換え]]を採用している。
 
 
 
関数への引数がプログラムへの入力で、関数を引数に作用させて評価して得られる値がプログラムからの出力であるとすると、コンピュータプログラムはある種の関数であると考えることができる。ここで、入力や出力は記憶装置中のファイルのようなものばかりではなく、マウスの動きの情報といった入力や、画面への表示といった出力も考えられ、関数型プログラミングにおいては実際にそれらを扱う関数としてモデル化する。
 
 
 
純粋関数型言語では、[[参照透過性]]が常に保たれるという意味において、全ての[[式 (プログラミング)|式]]や関数の評価時に[[副作用 (プログラム)|副作用]]を生まない。純粋関数型言語である{{lang|en|[[Haskell]]}}や{{lang|en|[[Clean]]}}は非正格な評価を基本としており、引数はデフォルトで[[遅延評価]]される。一方、{{lang|en|[[Idris]]}}は純粋だが正格評価を採用している。入出力などを[[参照透過性]]を保ったまま実現するために、たとえば {{lang|en|Haskell}} では[[モナド (プログラミング)|モナド]]、{{lang|en|Clean}} では{{仮リンク|一意型|en|Uniqueness type}}という特殊な型を通して一貫性のある表現を提供する。
 
 
 
非純粋関数型言語では、参照透過性を壊す、副作用があるような式や関数も存在する。{{lang|en|LISP}}などでデータ構造の破壊的変更などの副作用を多用したプログラミングを行うと、それはもはや手続き型プログラミングである。多くの場合、非純粋関数型言語の[[評価戦略]]は正格評価(先行評価)であるが、遅延評価する部分を明示することで、無限リストなどを扱えるものもある。
 
 
 
{{lang|en|[[JavaScript]]}}や{{lang|en|[[Java]]}}など近年の[[高水準言語]]には、関数型言語の機能や特徴を取り入れているものがあるが、変数の値やオブジェクトの状態を書き換えるプログラミングスタイルを通常とするため、関数型言語とは分類されない。一方{{lang|en|[[LISP]]}}は、その多くが副作用のある式や関数が多数あり、手続き型スタイルでのプログラミングがされることも多いが、理論的なモデル(「[[純LISP|純{{lang|en|LISP}}]]」)の存在や副作用を使わないプログラミングが基本であること、ないし主には歴史的理由から、関数型言語だとされることが多い。なお、{{lang|fr|Pascal}}では「手続き」と呼ばれるような値を返さないルーチンを、{{lang|en|C}}言語では<!--<code lang="C">void</code>型の値を返す関数と捉える--><!--void型の値というものは存在せず、存在しないものについて、それを返す関数と「捉える」ことは常人には困難-->「関数」と呼んでいるが、これは単にルーチンについて、細分類して別の呼称を付けているか、細分類せず総称しているか、という分類と呼称の違いに過ぎず「{{lang|fr|Pascal}}は手続き型言語で、C言語は関数型言語」<ref>[[共立出版]]『{{lang|en|ANSI C/C++}}辞典』ISBN 4-320-02797-3 など</ref>という一部の書籍に見られる記述は明確に誤りである。また、{{lang|en|OCaml}}や{{lang|en|Haskell}}などでは、「自明な値(例えば<code>()</code>)を返す」と、値を返さない(<code lang="Haskell">Void</code>など)は違うものであり、後者は停止しないか例外を出す(そのため結果がない)ようなプログラムを表す。
 
 
 
なお、「関数型言語である」と「関数型プログラミングをする」は同値ではなく、関数型には分類されない言語で関数型プログラミングをすることや、関数型プログラミングを基本とする言語の上で他のパラダイムを実現する例もある<ref name="Novatchev">{{cite web | url = http://arxiv.org/abs/cs/0509027 | author = Oleg Kiselyov, Ralf Lämmel | title = Haskell's overlooked object system | accessdate = Sep 10, 2005}}</ref>。
 
 
 
[[データフロープログラミング]]言語も関数型言語と共通した特徴を部分的に持つ。
 
 
 
== 歴史 ==
 
{{lang|en|LISP}}は、その基本機能のモデルとして関数型の純{{lang|en|LISP}}を持つなどといった特徴がある、最初の関数型言語である。今日広く使われている{{lang|en|LISP}}方言のうち特に{{lang|en|[[Scheme]]}}は関数型としての特徴が強い。
 
 
 
現代的な関数型プログラミング言語の祖としてはアイディアが1966年に発表された{{lang|en|[[ISWIM]]}}が挙げられるが、1970年前後までは関数型プログラミング言語の歴史は{{lang|en|LISP}}の発展が主である。1970年代にプロジェクトが開始された{{仮リンク|ロジック・フォー・コンピュータブル・ファンクションズ|en|Logic for Computable Functions}}のための言語として[[ML (プログラミング言語)|ML]]が作られている。
 
 
 
また{{lang|en|LISP}}において、変数のスコープに静的スコープを採用した{{lang|en|Scheme}}が誕生したのが1975年である。
 
 
 
1977年、{{lang|en|FORTRAN}}の設計と[[バッカス・ナウア記法]]の発明の業績でこの年の[[チューリング賞]]を受賞した[[ジョン・バッカス]]は、{{lang|en|''Can Programming Be Liberated From the von Neumann Style?: A Functional Style and Its Algebra of Programs''}}<ref>「プログラミングはフォン・ノイマン・スタイルから解放されうるか?: 関数型プログラミング・スタイルとそのプログラム代数」、[[米澤明憲]]訳『ACMチューリング賞講演集』([[共立出版]])pp. 83-156</ref>と題した受賞記念講演で関数型プログラミングの重要性を訴えた。講演では{{仮リンク|FP (プログラミング言語)|en|FP (programming language)}}という関数型プログラミング言語の紹介もした(サブタイトルの後半の「プログラムの代数」はこれを指す)が、これは{{lang|en|[[APL]]}}(特に、[[高階関数]]の意味がある記号({{lang|en|APL}}の用語ではオペレーター([[作用素]])という))の影響を受けている。
 
 
 
バッカスの{{lang|en|FP}}は広く使用されることはなかったが、この後関数型プログラミング言語の研究・開発は広まることとなった。1985年に{{lang|en|[[Miranda]]}}が登場した。1987年に、遅延評価の純粋関数型プログラミング言語の標準の必要性が認識され{{lang|en|Haskell}}の策定が始まった。1990年に{{lang|en|Haskell}} 1.0仕様がリリースされた。同じく1990年には{{lang|en|ML}}の標準である{{lang|en|[[Standard ML]]}}もリリースされている。
 
 
 
{{lang|en|Clean}}は1987年に登場したが、発展の過程で{{lang|en|Haskell}}の影響を受けている。1996年に、ML処理系のひとつであった{{lang|en|Caml}}に[[オブジェクト指向]]を追加した{{lang|en|OCaml}}が登場した。また日本ではSMLに独自の拡張を施した{{lang|en|[[SML#]]}}が開発されている。
 
 
 
21世紀に入ると、[[Java仮想マシン|{{lang|en|Java}}仮想マシン]]や[[共通言語基盤]]({{lang|en|CLI}})をランタイムとする関数型プログラミング言語を実装しようという動きが現れ、{{lang|en|[[Scala]]}}・{{lang|en|[[Clojure]]}}・{{lang|en|[[F Sharp|F#]]}}などが登場した。
 
 
 
== 代表的な関数型言語 ==
 
{|class="wikitable sortable"
 
!言語
 
!純粋さ
 
!型付け
 
|-
 
|{{lang|en|[[Clean]]}}||純粋||強い、静的
 
|-
 
|{{lang|en|[[Clojure]]}}||非純粋||動的
 
|-
 
|{{lang|en|[[Erlang]]}}||非純粋||動的
 
|-
 
|{{lang|en|[[F Sharp|F#]]}}||非純粋||強い、静的
 
|-
 
|{{lang|en|[[Haskell]]}}||純粋||強い、静的
 
|-
 
|{{lang|en|[[Idris]]}}||純粋||強い、静的
 
|-
 
|{{lang|en|[[Lazy K]]}}||純粋||型なし
 
|-
 
|{{lang|en|[[LISP]]}}||非純粋||動的
 
|-
 
|{{lang|en|[[Miranda]]}}||純粋||強い、静的
 
|-
 
|{{lang|en|[[ML (プログラミング言語)|ML]]}}||非純粋||強い、静的
 
|-
 
|{{lang|en|[[SML#]]}}||非純粋||強い、静的
 
|-
 
|{{lang|en|[[Standard ML]]}}||非純粋||強い、静的
 
|-
 
|{{lang|en|[[OCaml]]}}||非純粋||強い、静的
 
|-
 
|{{lang|en|[[Scala]]}}||非純粋||強い、静的
 
|-
 
|{{lang|en|[[Scheme]]}}||非純粋||動的
 
|-
 
|{{lang|en|[[Unlambda]]}}||非純粋||型なし
 
|}
 
 
 
=== その他の関数的性質を持つ言語 ===
 
* {{lang|en|[[APL]]}}
 
* {{lang|en|[[XSL Transformations|XSLT]]}}
 
 
 
== 外部リンク ==
 
* [http://www.sampou.org/haskell/article/whyfp.html なぜ関数プログラミングは重要か]
 
* [http://www.topxml.com/xsl/articles/fp/ {{lang|en|The Functional Programming Language XSLT - A proof through examples}}]
 
 
 
== 参考文献 ==
 
{{reflist}}
 
 
 
{{Normdaten}}
 
{{プログラミング言語の関連項目}}
 
  
 
{{DEFAULTSORT:かんすうかたけんこ}}
 
{{DEFAULTSORT:かんすうかたけんこ}}
 
[[Category:関数型言語|*]]
 
[[Category:関数型言語|*]]
 
[[Category:プログラミングパラダイム]]
 
[[Category:プログラミングパラダイム]]

2019/6/19/ (水) 12:10時点における最新版

関数型言語(かんすうがたげんご、: functional language

数学的な言語仕様をもつプログラミング言語。式を基本的な要素とする。LISPやAPLなどがある。



楽天市場検索: