5

私は Misko Hevery によるクリーンなコードについての講演を見ていましたが、彼は、作業をシミュレートするために、if ステートメントを含まない (人間が可能な限り少ない) プログラムを作成しようとしていると述べました... Smalltalk またはそのような言語、ここでは、インライン条件付き動作よりもポリモーフィズムが優先されます。

私の限られた理解では、関数型プログラミングは、これまでのところ私のような命令型のプログラマーにとっては難しいものです。なぜなら、私たちの状態変更方法論は関数型プログラムで表現する方法がないからです。関数は値を受け取って値を返すだけで、状態については何も知りません。

また、JS が関数型モデルをサポートできると称賛されているのも見てきました。

それで、私の最初のパラグラフと同様に、完全に新しい言語を学ぶのではなく、私が知っていて愛する言語で関数型パラダイムを試すことができるようにする、単純な一連の制限がありますか (最終的にはそうしますが、今すぐ精神を試すために)?

4

2 に答える 2

5

「関数型プログラミング」という用語には 2 つの意味があります。

最初の意味は、関数を操作するプログラムの能力です。すべての言語でこれができるわけではありませんが、javascript はできる言語の 1 つです。関数を変数に代入し、関数を引数に渡し、関数を返すことができる言語は関数型プログラミング言語と呼ばれるため、javascript はそのまま機能します。

この意味で、コールバックが一般的に使用されている最新の JavaScript コードを見ると、すでに関数型プログラミングを行っていることになります。

関数型プログラミングの 2 つ目の意味は、プログラム構成の主要な方法が変数ではなく関数であるプログラミング スタイルです。この意味で、ほとんどすべての言語は、変数の割り当てとループ構造を回避することで関数型スタイルで使用できます (代わりに再帰を使用してください)。

関数型コミュニティを見ると、関数型とは、最初の意味に加えて、2 番目の意味の非常に強力なバージョンを意味します。つまり、変数は回避されるだけでなく、禁止されます。Haskell のような言語には、変数の概念がありません。I/O のような副作用や変更可能な状態を処理するために、モナドと呼ばれる概念を使用します。

そこまで行く必要はありません。Lisp や Forth などの古典的な関数型言語では、変数を使用できました。可能な限りそれらを避ける必要があります。

Lisp および Forth スタイルの関数型プログラミングは、一時変数に何も割り当てずにリスト/配列を処理することによって大きく駆動されます。一部の人にとっては、このスタイルの方が読みやすいです。命令型スタイルでこれを行う場所:

var a = [1,2,3];
var b = 0;
for (var i=0;i=a.length;i++) {
    b += a[i] * 2;
}
// result is in b

機能的なスタイルでは、次のようにします。

[1,2,3].
    map(function(x){return x*2}).
    reduce(function(x,y){return x+y},0);

概念的には、機能的なスタイルでは、配列を反復処理するのではなく、配列にフィルターを適用しているように見えます。このようなコマンド ライン ツールを使用したことがあるgrep場合は、この概念が非常によく知られていることに気付くでしょう。

関数型スタイルでは、変数の代入をまったく導入していないことに注意してください。

関数型スタイルの 3 つの主要な配列メソッド/関数は、mapreduceおよびfilterです。それらを使用すると、for ループの 90% などを回避できます。

于 2013-10-27T20:57:54.113 に答える