\r\n\r\n
インターネット上でプログラミングのトレンドを読む機会が多い方は、関数型プログラミングという言葉を耳にしたことがあると思います。
関数型プログラミングがどんなものかわかっていても、どの言語が最適なのかわからないという方も多いのではないでしょうか。結局のところ、すべてのプログラミング言語が同じように作られているわけではないのです。関数型プログラミングの例は多くの言語で適用できますが、より快適に感じられる場所がまだあります。
数学の素養があれば、関数型プログラミングのスタートラインに立つことができます。これは、関数型プログラミングのパラダイムが、計算を数学的な関数として扱っているためです。数学の素養がないと、これは混乱するかもしれませんね。
基本的に関数型プログラミングは、関数とデータを不変なものとして扱います。関数にデータを渡すと、通常は変換されたデータなどが返されます。関数型プログラミングでは、関数は元のデータやプログラムの状態を変更してはならない。
すべてのプログラムは1つのことをうまくやるべきだというのは、Unixの哲学と似ているところがあります。関数は、プログラムのすべての部分に触れてはいけません。その代わり、入力を受けて出力をする必要があります。
関数型プログラミングでは、関数はできるだけ純粋であることが理想的です。つまり、同じ入力があれば、関数の出力は常に同じであることを意味します。
これは、オブジェクト指向プログラミングとは大きく異なる点です。オブジェクト指向プログラミングでは、通常、基本的なオブジェクトがあり、そのオブジェクトの一部であるデータや状態を変更するための様々なメソッドを持っています。メソッドは、明示的に宣言されていない場合、データや状態を変更することも可能です。
実際のプログラムでは、これが意味を持つこともある。つまり、何が状態やデータを変化させているのかが必ずしも明確でないため、プログラムの保守が困難になる可能性があるのです。関数型プログラミングは、もともとアカデミックな環境で使われていたものですが、そのような問題を防ぐためにも有効です。
プログラミング言語には、関数型プログラミングを許容するものもあれば、推奨したり強制したりするものもあります。 JavaScriptは前者のカテゴリーに属します。言語では関数型プログラミングパラダイムを使うことができますが、オブジェクト指向のアプローチも簡単に使うことができます。
とはいえ、JavaScriptに組み込まれた関数型プログラミングの例はたくさんあります。たとえば、高次の関数。これらの関数は、他の関数を引数として受け取ることができます。
JavaScriptには、配列を扱う関数がいくつかあります。
map(),
reduce(),
filter()これを連結することで、配列を使ったさまざまな操作を素早く行うことができる。
初期のJavaScriptではミュータビリティに問題があったが、ECMAScript標準の新しいバージョンでは修正されている。すべてを網羅するのではなく
var変数を定義するキーワードで、現在
c***tと
let1つ目は、その名の通り、定数を定義することができます。
letこれは,変数のスコープを,それが宣言された関数に限定するものです.
Pythonには欠点もありますが、関数型プログラミングはその一つではありません。Pythonの公式ドキュメントには、関数型プログラミングの紹介もあります。
まず、同じようなものがたくさん見つかります。
map(),
filter(),
reduce()といった機能を内蔵しています。JavaScriptと同様、他の関数を引数に取るため、これらの関数は高次関数である。Pythonでは、関数型プログラミングは
lambdaキーワード
ラムダ式はいくつかの使い方がある。使い方のひとつとして、単純な関数の省略記法として使うことができる。変数に値を代入する際、ラムダ式はPythonの標準関数と同じように呼び出すことができます。ラムダ式は、匿名関数として使用することができるという本当の利点があります。
匿名関数は、JavaScriptやこのリストにある他の言語でも動作します。特に高次の関数で使用する場合は、その場で定義できるので便利です。もし無名関数が使えなければ、簡単な追加機能もカスタム関数としてあらかじめ定義しておかなければならない。
JavaScriptやPythonと違い、Clojureはプログラマーの間でも知名度が低いかもしれません。Clojureは、1950年代後半に作られたLispプログラミング言語の方言で、関数型プログラミングに最適な、非常に特殊なやり方をもたらします。
他のLisp方言と同様に、Clojureはコードをデータとして扱います。これは、コード自身が効果的に変化することを意味します。他のLisp方言とは異なり、ClojureはJavaプラットフォーム上で動作し、JVMバイトコードにコンパイルされます。つまり、Clojureで書かれたものであろうとなかろうと、Javaのライブラリで動作させることができるのです。
Clojureは、このリストの前の言語とは異なり、基礎から構築された関数型プログラミング言語です。つまり、特にデータ構造において、可能な限り不変性を促進するのである。
Clojureは、すべてのプログラムが数学的に「証明可能」であることを期待しませんが、可能な限り純粋な関数を使用することを推奨しています。
このリストの中で新しい言語の1つは、2012年にevanczaplickiによって元々設計された純粋な関数型言語であるElmです。この言語は、特にユーザーインターフェイスを作成するために、Web開発者の間で人気を博しています。
このリストの前の各エントリとは異なり、Elmは静的型チェックを使用します。これにより、実行時例外が発生せず、コンパイル時にエラーが捕捉されるようになります。これは、ユーザーにとって目に見えるエラーが少ないということであり、大きなメリットです。
Elmコンパイラは、HTML、CSS、JavaScriptを対象としています。Clojureを使ってJava上で動作するプログラムを書くのと同様に、ElmでもJavaScriptのライブラリを使ったアプリケーションを書くことができます。
Elmと他の言語の大きな違いの1つは、ジェネリックが見当たらないことです。
filter(),
map()のようなデータ型によって定義されます。
List.mapまたは
Dict.map.
Haskellも静的型付けされた純然たる関数型言語である。Elmと違って、Haskellは以前からあるものです。この言語の最初のバージョンは、1990年に設計されました。最新の規格は「Haskell 2010」で、次のバージョンは2020年にリリースされる予定です。
すでに説明したように、Haskellの純粋機能とは、設計上、関数が副作用を持つべきでないことを意味します。そのため、関数型プログラミングは学問の世界から生まれたにもかかわらず、実社会の問題解決に理想的なのです。
Xmonadウィンドウマネージャは完全にHaskellで書かれています。pandocもこの言語を使用しており、さまざまなタイプのマークアップを他のフォーマットに変換します。
標準
map(),
filter(),
reduce()Learning Haskellは、JavaScriptやPythonの概念をHaskellに導入できるはずの他の高階関数と同様に、言語についてもっと学びたいのであれば、歓迎すべき出発点である。
あなたがまだ経験豊富なプログラマーでない場合、上記の用語や言語は少し難解に思えるかもしれません。それは良いことです。なぜなら、知らないことを知ることは、より良い学習者になるための第一歩だからです。
上に挙げた言語の中には、初心者に適したものもあります。初心者に最適なプログラミング言語のリストをご覧ください。この2つのリストには、いくつかの共通点があることにお気づきでしょう。
ご興味のある方は、簡単なPHPウェブサイトの作り方のガイドをご覧ください。