![]() |
ほんわかレス推奨です! この掲示板では、しばしば激しい論争が起きそうな気がします。 コメントを書くときはスレをよく読み、ほんわかレスに努めてください。 |
関数型プログラミングとは、プログラミングスタイルもしくはプログラミングパラダイムである。
関数型プログラミングとは、関数を数値などと同じように関数に受け渡しすることによって上手にプログラミングを行うスタイルである。関数型言語を使用してプログラミングすることともいえるが、最近はマルチパラダイムを採用するプログラミング言語も増えているため、関数型言語に分類されない言語でも関数型プログラミングを行うことが可能になってきている。
そのため、言語とプログラミングスタイルもしくはプログラミングパラダイムは分けて考えたほうがいいのではないかということで、関数型言語以外に関数型プログラミングという用語を使用することがある。
大きく注目されるようになったのは2010年代に入ってからではないかと思われるが、その歴史は非常に古く、世界で2番めに古いプログラミング言語とされるLispにまでさかのぼる。しかしながら、Lispの構造は当時のコンピューターで実行するには重すぎたため、そこそこの可読性を備えつつ高いパフォーマンスを発揮するC言語などに大きく水をあけられることになる。
その後しばらくは表舞台からは姿を消してひっそっりと受け継がれてきたが、やっと時代が追いついてきた。その要因として一つ目は作成するプログラムの高機能化に伴う開発の複雑化が挙げられる。開発の現場で人為ミスが多発し、無視できないほど生産性が損なわれるようになってきた。従って人為ミスを減らす環境に対する需要が開発言語を変更することまで視野に入ってくるほど高まってきたのである。二つ目はコンピューター性能の向上である。かつて何十万円出しても買えなかったようなコンピューターが、今やその数百倍以上のものが数万円で手に入るようになった。これによりプログラムを実行するPCの負荷が増えても、プログラムを開発する人間の負担が減る方がよいと考える背景が形成されるようになってきたのである。
関数型プログラミングができる言語としては最古参のLisp以外に、純粋関数型言語のHaskell、Java仮想マシンで動作するScala,Clojure、MicrosoftがOcamlをパクって作ったF#、Appleが伝統芸の旧環境の切り捨てをして打ち出したSwiftなどが続々と参入してきている。さらにはオブジェクト指向言語の代表格ともされるJavaですら2014年からは関数型プログラミングを言語仕様に取り入れるようになった。
前述のようにオブジェクト指向よりも歴史が古いともいえるわけだが、注目されるようになったのはオブジェクト指向よりも後で、オブジェクト指向の次に来るプログラミングパラダイムとみる人が多い。
それ故に関数型プログラミングに心酔する人の中にはオブジェクト指向を批判・否定する人も少なくなく、オブジェクト指向を使っている人との間には宗教戦争に近い感情的対立がある人もいるようである。
共存できないのは人であって、プログラミングパラダイム自体はオブジェクト指向と関数型プログラミングが共存可能であるとみる人も多い。チューリング完全である以上、できるできないの差はなく、やりやすいやりにくいだけの違いなのではなかろうか。
何をもって関数型プログラミングとするかが問題なのだが、歴史は古くても注目されてからの歴史は浅く、細かい点ではコンセンサスがなく言った者勝ちみたいなところがなくもない。
以下に、主だったものを列挙する。
関数を引数にしたり戻り値にしたりできる関数を高階関数という。これが使えることが関数型プログラミングを行うための最低条件であることは、おそらく共通認識とみて問題ないと思う。
プログラミングで関数といえば、計算する以外にも入出力をこなしたりと様々な機能を持っているFunctionを指す。しかし関数型プログラミングにおける関数は、数学的な関数をいう。両者の違いは、数学的な関数は、環境によらず同じ入力からは常に同じ出力が得られるという点である。
イミュータブルという表現も用いられる。プログラム中で変数は常に同じもの(値)を指しているということ。
変数の値が変わる環境では、プログラムの文面上ではその変数がどういう状態にあるか(たとえばその変数に初期化処理がされているかどうか)がわからず、それが人為的ミスの元凶であるという考え方があるのではないかと思われる。
参照透過ということは、変数の値は一度代入されてしまったら、再度代入して変更することは出来ないということである。
このことを突き詰めると、画面の表示という変数を変更するということも認められないことになってしまうので、実際のプログラミング言語は何らかの方法で妥協している。
実際にその値が必要になるまで計算しないで放置しておくこと。反対語は正格評価。ある意味仕方のない場合もある。f(g) = h (f, g, hは関数)とした場合hに引数が与えられるまでは計算のしようがないことがほとんどだからである。
これが許される背景としては、上記の参照透過性が欠かせない。後で計算しようとした時に引数の値が別の処理で変わっていたら結果もまた別のものになるからである。
この性質を用いて無限リスト(要素数が無限個のリスト)を(容易に)定義できるのが特長。
おや、誰か来たようだ
関数型プログラミングに関するニコニコ市場の商品を紹介してください。
急上昇ワード改
最終更新:2025/12/10(水) 06:00
最終更新:2025/12/10(水) 05:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。