Codewarsソリューション-入れ子にされて互いに作用する関数[終了]


11

私はコードウォーズのパズルの解決策を探していましたが、それが機能する理由がわかりません。Minus()はどのように機能しますか?

function makeNum(num, func) {
    if (func === undefined) {
        return num;
    } else {
        return func(num);
    }
}

function three(func) {
    return makeNum(3, func);
}

function eight(func) {
    return makeNum(8, func);
}

function minus(right) {
    return function(left) {
        return left - right;
    };
}

console.log(eight(minus(three()))); // will log out 5


ここではどのようにこの作品にいくつかの光を当てる助けてわずかに異なるアプローチで同様の質問です
ニック・パーソンズ

1
私はこれをレビュー監査として失敗した後、これを閉じることに投票しました。あなたがそれについて何を理解していないのか私には明白ではありませんでした。マイナスが機能しないと思った理由を説明するように編集した方がよいでしょう。
GS-

回答:


8

少し複雑です。:-)

console.log(eight(minus(three()))); 内側から実行されているので、それを追ってみましょう:

  • three()- makeNum(3, undefined)それが返すものを呼び出して返します。makeNum(3, undefined)が返される3ので、それが戻り値です。
  • minus(3)-呼び出しminus3として渡しrightます。minusを閉じる新しい関数を返しますright
  • eight(...)-呼び出し、makeNum(8, fnFromMinus)どこfnFromMinusで返された機能ですminus(3)makeNum(8, fnFromMinus)fnFromMinusに渡し、8などleftfnFromMinusリターンの結果left - right(つまり覚えてrightいる3fnFromMinusその上に閉じました)。

ので8 - 3あり5、最終的な結果は5、そのconsole.log戻ります。

これはインストルメントバージョンです。


2

ステップバイステップで作業する場合、実際にはそれほど複雑ではありません。徹底的に取り組みましょう。呼び出し:

three()

パラメータがない場合は、未定義の値をfuncとして渡すことを意味します。だからそれは言うことと同じです:

makeNum(3, undefined)

makeNumは、funcが未定義であることを確認すると、num(3)を返します。

したがって、これを次のように減らしました。

eight(minus(3))

それでは、方法を見てみましょう

minus(3)

評価します。マイナスは、指定したパラメーターが3であることを示します。そのため、「左」パラメーターを受け入れ、既に指定した3を差し引くことができる関数を返します。実行されません。それは単にそこに座って、「左」パラメータで呼び出されるのを待っているので、3を減算できます。

したがって、これを次のように減らしました。

eight(function(left){
    return left - 3;
})

これがどのように評価されるか見てみましょう。8は、この関数であるfuncパラメータで呼び出されます。

function(left){
    return left - 3;
}

次に、8とこの関数をmakeNumに渡します。

makeNum(8, func)

次にmakeNumはfuncが指定されている(したがって未定義ではない)ことを確認し、func(num)を8つの関数に返します。これは、次を渡すのと同じです。

8 - 3

8機能に戻ります。8つの関数はその値を受け取り、それを返します。したがって、これを次のように減らしました。

5

これはコンソールに記録されます。


0

minusキャプチャーされたパラメーターに渡されたパラメーターを使用して、呼び出しごとに新しい関数を返します。返された関数が呼び出されると、渡されたパラメーターに加えて、呼び出されたときに渡されたパラメーターを参照できます。これは、JavaScriptで関数をカレー化する1つの方法です。


0

このコードは、jsなどの関数型プログラミング言語の高次関数の例です。JavaScript関数はオブジェクトとして扱われ、それらを渡して返すこともできます。

高次関数は、関数を引数として受け取るか、関数を出力として返す関数です。

minus匿名(名前が定義されていない関数)関数を基本的に次のように返します:

function(left) {
        return left - 3; //right = 3
    };

この関数は、渡されたときeightに呼び出されfunc(8)、次のような結果になります。5


0

それを見る別の方法-この行を書き直すことができます:

console.log(eight(minus(three())));

なので:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.