2012-04-26 3 views
2

Интересно, есть ли идиома в Clojure для объединения нескольких функций аргумента в новую функцию, принимающую вектор. Новая функция должна применять первую функцию к первому аргументу и так далее.Объедините функции одного-arg в мульти-arg один в Clojure

Я думаю, что это полезно в ряде ситуаций. Например, вы можете преобразовать координаты x, y и z точки, используя более простые одномерные функции.

Я бы реализовал сам следующим образом, но я боюсь, что он уже должен существовать в стандартном API.

(defn vector-comp [& fns] 
    (fn [avect] 
    (vec (map #(%1 %2) fns avect)))) 
+0

Примечание '(vec ...)' вместо '(в [] ...)'. – kotarak

+0

Фактически литье к вектору обычно не требуется в Clojure - последовательности работают в большинстве случаев, где выполняется вектор. –

ответ

1

Другой способ написать это:

(defn vector-comp [& fns] 
    #(map apply fns % (repeat nil))) 

Я 99% уверен, что нет готового решения в стандартных библиотеках (juxt приходит ближе всего, что я знаю)

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