2015-10-27 1 views
1

Мне нужна функциональность функции Clojure juxt в JavaScript. Есть ли для этого нативная функция? Мы используем Ramda functional JavaScript library. Существует ли функция Ramda с функциональностью juxt?Эквивалентная функция в JavaScript/Ramda as clojure's juxt

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

+0

'R.ap()'? ........ – zerkms

+0

@zerkms - обертывание функций в массиве, а коллекция в массиве обеспечивает ту же функциональность! Вы должны сказать это как ответ. –

ответ

1

В какой-то степени R.ap выглядит так, как вы хотите.

2

Есть несколько способов добиться этого.

R.converge, что трубы данного значения через каждую функцию в указанном списке перед использованием результата каждого как соответствующий аргумент позиция функции, представленной в качестве первого аргумента converge - может быть, объяснен лучше с диаграммой:

add = (a, b) => a + b 
incr = a => a + 1 
decr = a => a - a 
double = converge(add, [incr, decr]) 

     ------  --- 
5 ----| incr |- 6 -| a | 
    \ ------  | d |- 10 
    \-| decr |- 4 -| d | 
     ------  --- 

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

var argsId = R.unapply(R.identity); 
var juxt = R.converge(argsId); 
var addSubtract10 = juxt([R.add(10), R.subtract(10)]); 
addSubtract10(5); //=> [15, 5] 

в качестве альтернативы (хотя, возможно, менее интуитивное), R.commute также можно использовать над списком функций. R.commute берет список некоторых аппликативных типов и эффективно превращает его наизнанку, чтобы стать аппликативным некоторым списком, где аппликативное поведение функций, предоставляемых Ramda, похоже на converge.

var juxt = R.commute(R.always); 
var addSubtract10 = juxt([R.add(10), R.subtract(10)]); 
addSubtract10(5); //=> [15, 5] 
+0

Мне нравится ваша диаграмма ascii. Эти два механизма имеют смысл. Хотя кажется, что «R.ap» еще больше напоминает «juxt». –

0

Существует еще один довольно простое решение Ramda:

var juxt = R.useWith(R.ap, [R.identity, R.of]); 

Это обсуждалось в Ramda-х issue #986, но в конечном итоге упал, когда ни один не подошел к чемпиону идею. Не стесняйтесь приносить его обратно.

+0

Я понимаю, я думаю, что разница между использованием 'ap' и' juxt' равна 'ap', зависит от функций, принимающих только 1 аргумент. Это довольно серьезное ограничение, если я правильно понял это. Для этого я верю, что функция «juxt» должна быть добавлена ​​в Ramda. –

+0

'ap' о совместимости с [спецификацией FantasyLand] (https://github.com/fantasyland/fantasy-land#apply). Любое сходство с 'juxt' - просто полезное совпадение. –

Смежные вопросы