Вызвать список функций с тем же аргументом в ramda - PullRequest
2 голосов
/ 09 мая 2020

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

let input = 2
let fns = [add(2), add(3), add(4)]

map(x => x(input), fns)
// this is what I want. Outputs [4, 5, 6]

Но мне не совсем нравится использование стрелочной функции (чисто по причинам стилистичности c), поэтому я хотел переписать ее как,

map(call(__, input), fns)
// this doesn't work and produces [[Function],[Function],[Function]]

Я не могу понять, почему x => x(input) не эквивалентно call(__, input). Я думаю, что call(__, input) вернет функцию, которая вызовет свой первый аргумент с input.

Вы можете объяснить, что я делаю неправильно? Мне кажется, что я неправильно понял использование __. И как мне использовать call или какую-либо другую встроенную функцию, чтобы элегантно написать это?

Я тоже пробовал,

// this also works and produces [4, 5, 6]
map(flip(call)(input), fns)

Но это тоже не устраивает меня из-за styleisti c причин. Мне кажется, что я что-то запихиваю в flip, и мне также не нравятся последовательные вызовы функций (...)(...).

Ответы [ 2 ]

3 голосов
/ 09 мая 2020

Вы ищете R.juxt :

juxt применяет список функций к списку значений.

const { add, juxt } = R

const input = 2
const fns = [add(2), add(3), add(4)]

const addTo = juxt(fns)

const result = addTo(input)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
2 голосов
/ 09 мая 2020

Ори Дрори показал, что juxt будет делать то, что вы хотите.

Что касается того, почему call не работает ... честно говоря, это, пожалуй, самая плохо продуманная функция во всей Ramda. (Я один из основателей Ramda, и я думаю, что написал это, поэтому я не оскорбляю никого, кроме себя.)

В этом очень и очень мало нужды. Зачем писать call(fn, 1, 2), если можно было просто fn(1, 2). Каррирование не работает должным образом, так как это переменный c, что само по себе является проблемой. Даже пример довольно неясен, в основном потому, что сложно найти какой-либо значимый пример.

Я бы просто пропустил его использование лично.

Но я не Мне не очень нравится использование функции стрелки (чисто по причинам стилистического c), поэтому я хотел переписать ее как

Из комментариев я предполагаю, что вы не означают стрелочные функции, а не объявления функций или выражения функций, а то, что вы предпочли бы писать это без точек. Предложение: используйте стиль без точек, который делает ваш код более читаемым, но пропустите его, если это не так; не делайте из него фети sh.

Здесь juxt([add(2), add(3), add(4)]) кажется нормальным, если juxt (сокращение от juxtapose) имеет для вас смысл. Но достаточно часто попытки бессмысленных действий приносят больше вреда, чем пользы.

Я тоже пробовал,

// this also works and produces [4, 5, 6]
map(flip(call)(input), fns)

Но это тоже не устраивает меня из-за styleisti c причин. Я чувствую, что приковываю что-то к flip,

Я склонен согласиться. flip - не лучшее решение практически любой проблемы. Но обычно заполнитель мне нравится еще меньше. Меня просто не устраивает!

и мне также не нравятся последовательные вызовы функций (...)(...).

Здесь я не согласен. Я переключил свой собственный код на почти универсальный, полностью карриновый стиль. Если это связано с несколькими последовательными вызовами функций и ужасными круглыми скобками, пусть будет так. Мне просто легче работать и рассуждать об этом.

...