2011-10-12 57 views
7

我该如何/应该将单个序列作为参数传递给期望多个参数的函数?具体来说,我试图使用cartesian-product并传递一个序列(见下文);然而,当我这样做时,结果并不是理想的结果。如果我不能将一个序列作为参数传递,我该如何将该序列分解为多个参数?谢谢。通过序列作为参数代替多个参数

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

回答

8

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]) 
+0

遗憾的双关语。我将编辑也加入真正的答案在某一时刻 –

+0

双关大众的需求删除: -/ –

+0

什么是双关语? – Ari

1

apply是亚瑟表现的一种方式。

另一种考虑的可能性是destructuring。具体嵌套向量结合:

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

+0

感谢您分享替代解决方案;我很感激。我选择了亚瑟的建议,因为在我的问题中,序列参数的大小是可变的。 – Ari