WReachの答えには同意しません。彼の答えを少し分解して、意見の相違がどこから来るのか見てみましょう。
まず、彼のコード:
function allOdd(words) {
var result = true;
for (var i = 0; i < length(words); ++i) {
var len = length(words[i]);
if (!odd(len)) {
result = false;
break;
}
}
return result;
}
と
function allOdd(words) {
return apply(and, map(compose(odd, length), words));
}
最初に注意すべきことは、彼が混同していることです。
プログラミング、および典型的な関数型スタイルよりも明示的な制御フローを持つ反復スタイル プログラミングの機能が欠落しています。
これらについて簡単に説明しましょう。
表現中心のスタイルは、物事が可能な限り物事に評価されるスタイルです。関数型言語は表現を好むことで有名ですが、実際には、構成可能な表現を持たない関数型言語を使用することも可能です。表現がなく、ステートメントだけの1 つを作成します。
lengths: map words length
each_odd: map lengths odd
all_odd: reduce each_odd and
これは、関数が純粋にステートメントとバインドのチェーンを介してチェーンされていることを除いて、前に示したものとほとんど同じです。
イテレータ中心のプログラミング スタイルは、Python で採用されているものかもしれません。純粋に反復的な、反復子中心のスタイルを使用しましょう。
def all_odd(words):
lengths = (len(word) for word in words)
each_odd = (odd(length) for length in lengths)
return all(each_odd)
各句は反復プロセスであり、スタック フレームの明示的な一時停止と再開によって結合されるため、これは機能しません。構文は部分的に関数型言語から着想を得ているかもしれませんが、完全に反復的な実装に適用されます。
もちろん、これを圧縮できます。
def all_odd(words):
return all(odd(len(word)) for word in words)
命令は今ではそれほど悪くはありませんよね?:)
最後のポイントは、より明示的な制御フローについてでした。これを利用するために元のコードを書き直してみましょう。
function allOdd(words) {
for (var i = 0; i < length(words); ++i) {
if (!odd(length(words[i]))) {
return false;
}
}
return true;
}
イテレータを使用すると、次のことができます。
function allOdd(words) {
for (word : words) { if (!odd(length(word))) { return false; } }
return true;
}
違いが次の場合、関数型言語のポイントは何ですか。
return all(odd(len(word)) for word in words)
return apply(and, map(compose(odd, length), words))
for (word : words) { if (!odd(length(word))) { return false; } }
return true;
関数型プログラミング言語の主な決定的な特徴は、典型的なプログラミング モデルの一部として突然変異を取り除くことです。これは、関数型プログラミング言語にはステートメントがない、または式を使用しないことを意味するとよく考えられますが、これらは単純化したものです。関数型言語は、明示的な計算を動作の宣言に置き換えます。これにより、言語はそれに対してリダクションを実行します。
この機能のサブセットに制限することで、プログラムの動作についてより多くの保証を得ることができ、これによりプログラムをより自由に構成することができます。
関数型言語を使用すると、通常、新しい関数を作成するのは、密接に関連する関数を作成するのと同じくらい簡単です。
all = partial(apply, and)
関数のグローバルな依存関係を明示的に制御していない場合、これは単純ではなく、おそらく不可能です。関数型プログラミングの最大の特徴は、より一般的な抽象化を一貫して作成し、それらを組み合わせてより大きな全体にできることを信頼できることです。