2016-05-12 16 views
2

このようなJavaScriptのような関数作成の繰り返しを避けることで、このスニペットのより多くの機能を書くにはどうすればよいですか?ちょうど文脈を与えるために、私は現在の値から最終値への動きがすでに達成されているかどうかを見いだそうとしています。deltaValueは、動きがより高い値に向かっているならば正であり、そこと仮定JSの上位関数を使用した繰り返しの回避

if (deltaValue > 0) { 
    maxPossibleValue = function(current, final) { 
     return current > final ? final : current; 

    } 
} else { 
    maxPossibleValue = function(current, final) { 
     return current < final ? final : current; 
    } 
} 

が機能し、JavaScriptでltgtとして<>を存在していた、私はちょうどpredicateは高階関数を扱うltgtある単一の関数でこれを評価した可能性があります。しかし、JSにはそのような関数はネイティブにないので、上記の方法は唯一の方法ですか?

maxPossibleValue = function(predicate) { 
    return function(c, f) { 
     return predicate(c, f) ? c : f } 
} 

これは、必要な述語関数をテンプレート化し、新しい関数を返すものと考えることができます。私はSchemeでそのようなパターンを見てきました。

+1

よりも従うことが困難であるべきない理由を見ませんか? maxPosibleValue(function(c、f){return c> f;})(c、f); – dlopez

+0

これは目標を達成していますか?私は微妙に論理を使って変数を反転させ、私が望むものを達成することができます。 – Nishant

+1

私が苦労したインライン関数は、あなたが必要と思われるアプローチの1つです(deltaValueが0より大きい場合)。明らかに、あなたは必要な振る舞いを得るために毎回関数のロジックを変更することができます。 – dlopez

答えて

1

あなたの要件には、すでにMath.minMath.maxの仕組みがあります。

コードは次のように見えますが、maxPossibleValue

var maxPossibleValue = function (predicate) { 
     return function (c, f) { 
      return predicate(c, f) 
     } 
    }, 
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max); 

の作業例missleadingされています。あなたは正しい方向にニーナの答えポイント@

var deltaValue = -1; 
 
var maxPossibleValue = function (predicate) { 
 
     return function (c, f) { 
 
      return predicate(c, f) 
 
     } 
 
    }, 
 
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max); 
 

 
document.write(comparer(2, 8));

+0

関数名の代替提案?私は 'maxPossibleValue'を私がここでやっている遷移関数のコンテキストから使いました。あるいは、おそらく 'Math.max'と衝突するかもしれません:) – Nishant

+1

多分' applyPredicate'? –

+1

'Math.max'と' Math.min'は述語ではありません。 'function(c、f){戻り述語(c、f); } 'は述語に簡素化されます(ηの減少) – naomik

2

をしかしMath.maxとMath.minは述語ではありません。答えはあまりにも複雑です。

私はあなたがこのような何かをしようとしている答えは、この

function calculateValue(delta, final, current) { 
    return (delta > 0 ? Math.min : Math.max)(final, current); 
} 

calculateValue(-1, 5, 10); // 10 
calculateValue(1, 5, 10); // 5 
+0

私は同意します。私は初めに過度に複雑にしてしまったと感じ、NinaはMath.min、Math.max関数を見つけてその一部を修正しました。しかし、私はその微妙なことが重要だと思っています*私はMath.minとMath.maxを扱っていて、そのためにカスタムロジックを書いていないことを知っています:) – Nishant

+1

@Nishantあなたは関数として 'lt'と' gt'について間違っていませんどちらか。 JavaScriptは、関数の代わりに演算子としてこれらを持つためにうんざりしています。私はそれらを 'const lt = x => y => y y => y> x;' ...と定義しています。演算子。 – naomik

+0

彼らはこれを言語に追加したいと思っています:) – Nishant

関連する問題