Частичные функции с привязкой - PullRequest
0 голосов
/ 05 июня 2018

Так недавно я обнаружил, что вы можете выполнять частичные функции / карри с помощью js, используя bind.Например:

const foo = (a, b, c) => (a + (b / c))
foo.bind(null, 1, 2) //gives me (c) => (1 + (2 / c))

Однако это работает, только если части, которые вы хотите карри, в порядке.Что если бы я хотел добиться следующего с помощью bind?

(b) => (1 + (b / 2))

Пробовал различные решения, такие как:

foo.bind(null, 1, null, 2)

Есть идеи?Можно ли сделать это с помощью vanilla es6?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

В настоящее время я думаю о двух способах реализации этого (кроме обертки от @NinaSholz, что довольно неплохо):

1.Использование функции curry, которая объединяет два аргумента:

const foo = (a, b, c) => a + b / c;

function curry(fn, ...args) {
  return function(...newArgs) {
    const finalArgs = args.map(arg => arg || newArgs.pop());
    return fn(...finalArgs);
  };
}

const curriedFoo = curry(foo, 1, null, 2);

console.log(curriedFoo(4)) // Should print 1 + 4 / 2 = 3

Здесь мы просто отправляем null или undefined вместо параметров, которые мы хотим пропустить, и во втором вызове мы отправляем эти параметры в порядке

2.Использование объектов для именованных параметров

const foo = ({a, b, c}) => a + b / c;

function curry(fn, args) {
  return (newArgs) => fn({ ...args,
    ...newArgs
  });
}

const curriedFoo = curry(foo, {
  a: 1,
  c: 2
});

console.log(curriedFoo({
  b: 4
}));

Здесь мы используем преимущества оператора ... (распространение) и синтаксиса объекта в сигнатуре функции для объединения двух объектов аргумента;

0 голосов
/ 05 июня 2018

Вы можете использовать оболочку для переупорядочения аргументов.

const
    foo = (a, b, c) => a + b / c,
    acb = (a, c, b) => foo(a, b, c);

console.log(acb.bind(null, 1, 2)(5));
...