いくつかの機能を作ってみたいです。 f3(x)
がf1(f2(x))
と同じものでなければならない場合f3(x,y)
が、その後f1(x, f2(y))
と同じものでなければならない場合f3 = _.flowRight(f1,f2);
その後、Lodashの流れを使って多様なアリティの関数を構成する方法は?
を
...:私はすでにこのことを知っていますか?
(ユースケースは、Node.jsの/特急ミドルウェア機能の組成物である。)
いくつかの機能を作ってみたいです。 f3(x)
がf1(f2(x))
と同じものでなければならない場合f3(x,y)
が、その後f1(x, f2(y))
と同じものでなければならない場合f3 = _.flowRight(f1,f2);
その後、Lodashの流れを使って多様なアリティの関数を構成する方法は?
を
...:私はすでにこのことを知っていますか?
(ユースケースは、Node.jsの/特急ミドルウェア機能の組成物である。)
あなたはlodash相当を持っていない可能性が非常に具体的な要件を持っているようですね。
これはあなた自身のヘルパー機能を書くのはなぜでしょうか?
function composeFuncs(f1, f2) {
return function(x, y) {
return f1.call(this, x, f2.call(this, y));
};
}
var myObj = {
add: function(val1, val2) {
return this.myVal + val1 + val2
},
mult: function(val) {
return this.myVal * val
},
myVal: 7
};
myObj.newFunc = composeFuncs(myObj.add, myObj.mult);
// 7 + 1 + 7 * 2 = 22
console.log(myObj.newFunc(1, 2));
編集:は_.flowRight
が行うthis
同じように処理するために更新しました。
もちろん、私はこれを行うことができましたが、おそらくlodashから_.flowRightとして 'this'の扱いをしなければならないでしょう。関数型プログラミングではかなり新しいことがあるので、私は必要なもののようなもののためのよく知られたパターンがあると思った。 :) – matths
@matths 'this'伝播を含むように変更されました。これを使用したい場所の例を教えてください。私はこれによく知られているパターンに慣れていませんが、あるかもしれません。 – JLRishe
私は現在エクスプレス/ミドルウェアのような接続機能を書いています。一つは 'method(m、handler)'です。ここでmはget、post、putなどで、もう一つは 'path(p、handler)'です。合成は 'method(m、path(p、handler))'を実行する 'request(m、p、handler)'でなければなりません。各ミドルウェアの戻り値は、単独でハンドラ関数です。私は確信が持てません、私は十分に説明することができます。 – matths
次の画像では、値のプレースホルダとして
{_}
を使用します。我々は何かを渡すコードで穴と考えてください。
[OK]をはさんがあなたの関数がしなければならないだろうか想像してみましょう...
f1
とf2
の違いは何ですか? f1
は1つの引数だけを取得する単項関数です。f2
は2つの関数を取得するバイナリ関数です。どの人がどの場所に行くのかを覚えていますか?f1(x)
が配置される位置を支配するものはf2
ですか?
f2(f1(x),y)
f2(y,f1(x))
...f1
の位置が覚えていますか?あなたが好きな構図を機能リコールなど、多くの機能を一緒に連鎖することができるはずです。 someFunc
の無駄を理解するのを助けるために、3つの関数と3つの引数を受け入れることを想像してみましょう。ここでも、パターンは
f2
とf3
それぞれが2f1
を持っていることはf2
とf3
は前の関数の値が常に右側に呼び出す必要が行っていることは事実です?
f3(z,f2(y,f1(x)))
f3(f2(y,f1(x)),z)
にたぶんf3
ニーズが、右からf2
チェーンの比較しますか?答えは、自己実現
機能組成物はここに誤用されています。関数の構成は、単項関数を排他的に(それぞれ1つの引数を受け入れる関数)構成している場合にのみ機能します。直ちに分解され、高いアリティの関数で混合するときには一般化できません。
f3
が名前を必要とし、f1
,f2
の2つのパラメータの組み合わせである場合、コードは…それは非常に多くの任意の選択を行いますので
const f3 = (x,y) => f1(x, f2(y))
、それはは、任意の有用な方法で一般化することはできません。それはそのままにしましょう。
「だから、様々なアリティの機能を構成する方法はありますか?」
確かに、さまざまな実用性の技術があります。私はああ、ところで、私たちは単一のコード行でLodashのflowRight
(複雑なflow
のラッパー)を置き換え
const partial = (f,...xs) => (...ys) => f(...xs, ...ys)
const add = (x,y) => x + y
const mult = (x,y) => x * y
const sq = x => mult (x,x)
// R.I.P. lodash.flowRight
const compose = ([f,...fs]) => x =>
f === undefined ? x : f (compose (fs) (x))
let f = compose([partial(add, 1), sq, partial(mult, 3)])
console.log(f(2))
// add(1, square(mult(3, 2)))
// add(1, square(6))
// add(1, 36)
// => 37
ここで実用性の高いpartial
機能の使用方法を示します。
私はlodashの流れについての昨日の答えを書いた。私はいくつかの関数が作成されることを意図していないので、非常に役に立ちますと思っています:http://stackoverflow.com/a/42139851/633183 – naomik
1時間前に別の解答を既存のコードベースに書きました。私はそれがthsiトピックに関連していると思うと思う:http://stackoverflow.com/a/42164779/633183 – naomik
あなたの "問題"はあなたが様々な* arity *の機能を構成しようとしていることです。バイナリ関数を持つ単項関数。関数の構成は、単項関数を排他的に使用する場合に最適です。簡単な答えは 'const f3 =(x、y)=> f1(x、f2(y))'です。 – naomik