8

我如何/应该将单个序列作为参数传递给需要多个参数的函数?具体来说,我正在尝试使用笛卡尔积并将其传递给一个序列(见下文);但是,当我这样做时,结果不是我想要的。如果我不能将单个序列作为参数传递,我该如何/应该将序列分解为多个参数?谢谢。

(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))
4

2 回答 2

10

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 tunatly for 函数很好地做到了这一点。

(for [x ["a" "b"] y [1 2]] [x y])
(["a" 1] ["a" 2] ["b" 1] ["b" 2])
于 2011-10-12T19:58:12.833 回答
1

apply正如亚瑟所展示的那样,这是一种方式。

另一个需要考虑的可能性是解构。具体嵌套向量绑定:

user=> (let [[v1 v2] '([:a :b] [1 2])]
         (cartesian-product v1 v2))

于 2011-10-12T20:57:37.630 回答