💊

BFE.dev解答記録 #1 implement curry()

2020/09/28に公開

https://bfe.dev はFrontEnd版のLeetCode、GAFAの面接を受けるなら練習した方がいいかなと。
以下は自分の練習記録です。

第一問 #1 implement curry()

まずサンプルコードからinput/outputを決めていきます

const  join = (a, b, c) => {
   return `${a}_${b}_${c}`
}

const curriedJoin = curry(join)

curriedJoin(1, 2, 3) // '1_2_3'

curriedJoin(1)(2, 3) // '1_2_3'

curriedJoin(1, 2)(3) // '1_2_3'

上から見るとcurry()はfunctionを返し、しかも任意の数の引数を渡せることができ、function自体は以下のことをする:

  1. 引数足りるなら、joinを実行して結果を返す
  2. 引数足りなければ、新しいfunctionを返て、1を繰り返す

2番はすごく大事です。curriedJoin(1,2) で返すfunctionは、渡される引数の前に1と2をinsertする必要。これは``Function.prototype.bind()`を使えば行ける。

function curry(func) {
  return function curried(...args) {
    // 1. if enough args, call func 
    // 2. if not enough, bind the args and wait for new one
    if (args.length >= func.length) {
      return func.apply(this, args)
    } else {
      return curried.bind(this, ...args)
    }
  }
}

よし, 通った!

Alt Text

第一問は簡単で、興味あれば一緒に https://bfe.dev/ja で練習していきましょう。

Discussion