BFE.devでのAI解答例 - JavaScript コーディング問題
1. curry()を実装する
解答例:
function curry(func) { return function curried(...args) { if (args.length >= func.length) { return func.apply(this, args) } else { return function (...newArgs) { return curried.apply(this, args.concat(newArgs)) } } }}
この実装では、カリー化されたfunctionは、必要な引数を受け取るまで引数を溜め込み、必要な引数が受け取れるようになったら元のfunctionに渡すようになっています。引き渡されたfunctionが戻ってくる場合、溜め込んでいた引数配列と新しい引数配列を連結して再帰を行います。
func.length
は、functionの引数の数を返す組み込みlengthプロパティを参照します。
apply()
は、特定のthis
値でfunctionを呼び出し、array-likeオブジェクトの引数のリストをarrayに分解して関数に渡すJavaScriptの組み込みfunctionです。apply(this, [arg1, arg2, ...])
はthis.function(arg1, arg2, ...)
と同じです。
これにより、最後に必要な引数が渡されると、元のfunctionが呼び出されたときと同じようにthisと引数が設定されます。
使用例の解説:
-
join()
を宣言して、a, b, cの引数を1つの文字列に連結された文字列を返します。 -
curry(join)
を呼び出してcurriedJoin()
functionを取得しました。 -
curriedJoin(1, 2, 3)
を呼び出すと、必要な引数がすでに提供されているので、join(1, 2, 3)
が呼び出され、"1_2_3"
が返されます。 -
curriedJoin(1)(2, 3)
を呼び出すと、最初に提供された引数は1です。残りの引数2と3は、新しいfunctionに渡されます。新しいfunctionにはまだ足りない引数があるので、新しいfunctionもcurriedJoin()
と同じように呼び出されます。curriedJoin(1, 2, 3)
と同じように、join(1, 2, 3)
が呼び出されます。 -
curriedJoin(1, 2)(3)
を呼び出すと、最初に提供された引数は1と2です。残りの引数3は、新しいfunctionに渡されます。 新しいfunctionには、必要な引数がすでに提供されているので、join(1, 2, 3)
が呼び出されます。
この実装については、もう少し詳しく説明することができますが、この程度が理解があると良いでしょう。