web-dev-qa-db-ja.com

関数型言語としてのJavaScript

私は関数型プログラミングの概念を理解しようとしています。

私は長年、JavascriptをWebアプリケーションのクライアントサイドスクリプティングに使用してきました。プロトタイプの使用は別として、すべて単純なDOM操作、入力検証などでした。

最近、私は よく読む を持っています。Javascriptは関数型プログラミングをサポートする言語の1つです。

私はJavascriptに精通していて、JavaScriptを使用して関数型プログラミングを学ぶのが好きです。主な機能の概念にもっと集中できるようになり、まったく新しい構文に悩まされたり、気を取られたりしないようにします。

要約すると、Javascriptは関数型プログラミングの概念を学ぶのに適した選択肢ですか? Javascriptのどの機能が関連している/関数型プログラミングをサポートしていますか?

61
Ash

JavaScriptはファーストクラスの機能をサポートしています。 関数型プログラミング手法を使用してエレガントなJavaScriptを作成するを参照してください。

43
Mark Cidade

高次JavaScript は、JavaScriptの機能的な側面に慣れるための素晴らしい方法です。また、大きな本に飛び込まずに足を濡らしたい場合に備えて、比較的短い読み物です。

9
kamens

誰が言ったのか覚えていませんが、javascriptは「Scheme with ALGOL syntax」と呼ばれています。したがって、Scheme/LISPを学ぶために、Javascriptは悪いスタートではありません。ただし、LISPなどの関数型言語は、Haskellなどの純粋な関数型言語とはかなり異なります。

「ファーストクラス関数」(関数は値であり、変数に割り当てることができることを意味する)とは別に、字句スコープも関数型言語を構成する固有の部分です。

高次Javascript および The Little Javascripter についてはすでに言及しています。どちらも優れたテキストです。さらに、 Javascriptでの高次プログラミング の方が簡単に開始できます。

6
troelskn

JavaScriptはFPをある程度サポートしますが、直接推奨するものではありません。そのため、ギャップを埋めるために Oliver Steele's Functional のようなプロジェクトが存在します。 t FPの学習に推奨します。代わりにF#を確認してください。

6

JavaScriptでいくつかの関数型プログラミングの概念をすぐに理解できると思いますが、関数型プログラミング言語のようにJavaScriptを一貫して使用することは一般的な方法ではありません。少なくとも明らかに一般的ではありません。ほとんどの人はJavaScriptで関数型プログラミングを行う方法を正確に示すチュートリアルを投稿しません-マルクシダードが指摘したものは実際にはかなりまともな例ですが、あなたはそれの多くを見つけることはありません。 JavaScriptでクロージャーを使用するときと同じように、機能的な側面はしばしば明らかではありませんが、それを行っていることに気づいていません。

2つの関数を引数として3番目の関数に渡し、最初の2つの関数に関連する実行を戻り値にするというアイデアは、ほとんど常にjQueryのような本格的なライブラリのコアにのみ現れる高度な手法です。 。自己実行型の匿名関数などが定着しましたが、まだ一貫して使用されていません。チュートリアルの大部分は、代わりにJavaScriptのOO機能、たとえばプロパティとメソッド、スコープ、アクセス制御の作成方法、およびコンストラクターのプロトタイププロパティの使用方法に重点を置いています。正直なところ、関数型プログラミングの場合あなたが望むものなら、私はこの機能で厳密に知られている言語を選択します。

6
user4903

私は The Little Schemer を読むことをお勧めします。これは再帰についてのかなりスリムな本であり、機能的なスタイルへの良い入門書です。 Schemeに焦点を当てていますが、JavaScriptに簡単に適用できます http://javascript.crockford.com/little.html を参照してください。私はそれが私のJavaScript開発に非常に役立つことを発見しましたが、それは最後に向かってかなりトリッキーになります。

3
slashnick
2
Marijn

JavaScriptはマルチパラダイム言語です。関数型言語の概念を学ぶことが目的の場合は、 OCaml または Haskell のような純粋な関数型言語から始めてみてください。