7/2(月)よりスマホまたはPCでアクセスした場合、各デバイス向けのサイトへ自動で転送致します
関数型言語とはプログラミング言語の一カテゴリ。書き込みできるメモリを持たず、全ては関数で作られるという世界観を持つ。
広い意味では、関数型の世界観を基調としつつ、時々ズルしてメモリを使う言語も含む。
チューリングマシン系の言語(手続き型言語)では、プログラム=関数+メモリ空間だが、関数型言語は本当に関数しか使わない。でもちゃんとチューリング完全。
CとかJavaとかしか知らない人間から見ると摩訶不思議だが、単にメモリがメモリに見えないというだけで、持続的な記憶自体は「実行文脈」という形で存続している。
ピュアな関数型としてはHaskellが有名。Lisp、MLなんかはズルするクチ。
▲関数型言語というのは、「数学的」関数を扱う言語であり、数学的関数とは副作用を認めず、必然的に参照透過となる。しかし、それでは実行結果の表示すらすることができないので、何らかの妥協が必要になる。この妥協の仕方で純粋関数型言語と非純粋関数型言語に分かれる。ただ、「純粋」や「関数型」の定義が人により異なる場合があるので、下記の分類は絶対的なものではない。
純粋関数型言語は、副作用が混じらず純粋である。副作用はモナドなどの機構を用いて純粋部分から分離されている。
一方、非純粋関数型言語では、多少の制約を受けるものの厳密な分離を行わなくても副作用を扱うことができるようになっている。
Lispは関数型言語の元祖だが、後続の言語に比べると厳密さを欠いているため、関数型言語の分類から相対的に外されることもある。
後付けで関数型プログラミングが可能になった言語や、関数型プログラミングが最重要視されない言語まで関数型言語と呼ぶべきかどうかは人によって意見が異なるところではある。
▲