私は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));
}
最初に注意すべきことは、彼が合同していることです:
プログラミング、そして典型的な関数型スタイルよりも明確な制御フローを持つ反復型プログラミングの機能がありません。
これらについて簡単に説明しましょう。
式中心のスタイルとは、物事を可能な限り評価して物事を評価するスタイルです。関数型言語は式を愛することで有名ですが、実際には、合成可能な式なしで関数型言語を使用することは可能です。私は、表現がなく、単に声明があるところを作り上げます。
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)
関数のグローバルな依存関係を明示的に制御していない場合、これは単純ではなく、おそらく不可能です。関数型プログラミングの最大の特徴は、より一般的な抽象を一貫して作成でき、それらを組み合わせてより大きな全体にできることを信頼できることです。