Рамда: запутался насчет трубы - PullRequest
0 голосов
/ 10 января 2019

Я изучаю функциональное программирование в JS и делаю это с Рамдой.

Я пытаюсь создать функцию, которая принимает параметры и возвращает список. Вот код:

const list = R.unapply(R.identity);

list(1, 2, 3); // => [1, 2, 3]

Теперь я попытался сделать это, используя pipe:

const otherList = R.pipe(R.identity, R.unapply);

otherList(1,2,3);
// => function(){return t(Array.prototype.slice.call(arguments,0))}

, который возвращает странную функцию.

Это:

const otherList = R.pipe(R.identity, R.unapply);

otherList(R.identity)(1,2,3); // => [1, 2, 3]

работает по некоторым причинам.

Я знаю, что это может быть вопрос новичка, но как бы вы построили f (g (x)) с помощью pipe, если f равно unapply, а g равно identity?

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Вы бы использовали unapply для преобразования функции, которая обычно принимает свои аргументы в виде массива, в функцию, которая может принимать любое количество позиционных аргументов:

sum([1, 2, 3]); //=> 6
unapply(sum)(1, 2, 3) //=> 6

Это позволяет вам, помимо прочего, отображать любое количество позиционных аргументов:

unapply(map(inc))(1, 2) //=> [2, 3]
unapply(map(inc))(1, 2, 3) //=> [2, 3, 4]
unapply(map(inc))(1, 2, 3, 4) //=> [2, 3, 4, 5]

identity всегда будет возвращать свой первый аргумент. Таким образом, unapply(identity)(1,2) совпадает с identity([1,2]).

Если вашей конечной целью было создание функции, которая возвращает список ее аргументов, я не думаю, что вам нужно было pipe в первую очередь. unapply(identity) уже делал это.

Однако, если вам нужно убедиться, что ваш канал получает параметры в виде списка, вам просто нужно обернуть pipe с unapply:

const sumplusplus = unapply(pipe(sum, inc, inc));
sumplusplus(1, 2, 3); //=> 8
0 голосов
/ 11 января 2019

Похоже, вы действительно неправильно думаете о pipe.

Когда вы используете unapply(identity), вы передаете функцию identity на unapply.

Но когда вы пытаетесь pipe(identity, unapply), вы получаете функцию, которая передает результаты вызова identity в unapply.

То, что это работает, в основном совпадение: pipe(identity, unapply)(identity). Думайте об этом как (...args) => unapply(identity(identity))(...args). Поскольку identity(identity) - это просто identity, это превращается в (...args) => unapply(identity)(...args), что можно упростить до unapply(identity). Это означает только что-то важное из-за природы identity.

0 голосов
/ 10 января 2019

Считайте R.unapply документы . Это функция, которая получает функцию и возвращает функцию, которая может принимать несколько параметров, собирать их в один массив и передавать в качестве параметра для упакованной функции.

Таким образом, в 1-м случае он преобразует R.identity в функцию, которая может принимать несколько параметров и возвращать массив.

Во втором случае R.unapply получает результат R.identity - одно значение, а не функция. Если вы передаете R.identity в качестве параметра в канал, R.unapply получает функцию и возвращает функцию, которая аналогична 1-му случаю.

Чтобы R.unapply работал с R.pipe, вам необходимо передать R.pipe R.unapply:

const fn = R.unapply(R.pipe(
  R.identity
))

const result = fn(1, 2, 3)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
...