реализовать эквивалентную функцию стрелки и нормальную функцию с параметрами покоя (переменные аргументы) - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу реализовать функцию стрелки, которая эквивалентна другой нормальной функции, работает следующим образом:

f(h)(a1)(a2)...(an) работает как h(a1, a2, ..., an).

Я думаю, что мне нужно реализовать его с помощью следующего psuedocode, но я не знаю, как узнать, каково количество аргументов функции h?

псевдокод:

function h (...varArgs) {

}

var f = (h) => {
    return ...
}

1 Ответ

0 голосов
/ 01 ноября 2018

One-вкладыш:

let curry = fn => (fn.length < 2) ? fn : x => curry(fn.bind(0, x))
//

let h = (a, b, c) => a + '/' + b + '/' + c
console.log(curry(h)(1)(2)(3))

Читается: "если arity (количество аргументов) равно 0 или 1, curry f = f, в противном случае создайте функцию с одним аргументом, которая вызывает карри версию программы ввода с первым параметром, зафиксированным в замыкании.

Конечно, это не будет работать, если арность (fn.length) неизвестна. Для работы с истинными переменными функциями единственный вариант - добавить метод к значению (toString/valueOf) в карри-функцию, чтобы она могла работать в некоторых контекстах:

let curryVar = fn => x => {
  let b = fn.bind(0, x), f = curryVar(b)
  f.toString = b
  return f
}

let hv = (...xs) => xs.join('|')

console.log(curryVar(hv)(1)(2)(3) + "!")
...