Передать последовательность в качестве аргумента вместо нескольких аргументов - PullRequest
8 голосов
/ 12 октября 2011

Как я могу / должен передать последовательность single в качестве аргумента функции, которая ожидает множественных аргументов?В частности, я пытаюсь использовать декартово-произведение и передать его последовательность (см. Ниже);однако, когда я делаю это, результат не является желаемым.Если я не могу передать одну последовательность в качестве аргумента, как я могу / должен разбить последовательность на несколько аргументов?Спасибо.

(use '[clojure.contrib.combinatorics :only (cartesian-product)])
(cartesian-product (["a" "b" "c"] [1 2 3]))

Результат:

((["a" "b"]) ([1 2]))

Желаемый результат

(("a" 1) ("a" 2) ("b" 1) ("b" 2))

Ответы [ 2 ]

9 голосов
/ 12 октября 2011

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

(apply cartesian-product  '(["a" "b" "c"] [1 2 3]))
(("a" 1) ("a" 2) ("a" 3) ("b" 1) ("b" 2) ("b" 3) ("c" 1) ("c" 2) ("c" 3))

в качестве другого примера:

(apply + (range 10))

оценивает (range 10) в последовательность (0 1 2 3 4 5 6 7 8 9) и затем создает этот вызов функции

(+ 0 1 2 3 4 5 6 7 8 9)


и обратно по многочисленным просьбам:

для в порядке, функция for делает это хорошо.

(for [x ["a" "b"] y [1 2]] [x y])
(["a" 1] ["a" 2] ["b" 1] ["b" 2])
1 голос
/ 13 октября 2011

apply - это один из способов, как показывает Артур.

Другая возможность для рассмотрения - деструктура .Специально вложенное векторное связывание: user=> (let [[v1 v2] '([:a :b] [1 2])] (cartesian-product v1 v2))

...