我如何/应该将单个序列作为参数传递给期望多个参数的函数?具体来说,我正在尝试使用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))
答案 0 :(得分:9)
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函数很好地完成了这项工作。
(for [x ["a" "b"] y [1 2]] [x y])
(["a" 1] ["a" 2] ["b" 1] ["b" 2])
答案 1 :(得分:1)
apply
是亚瑟显示的一种方式。
另一种考虑的可能性是destructuring。特别是嵌套的矢量绑定:
user=> (let [[v1 v2] '([:a :b] [1 2])]
(cartesian-product v1 v2))