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関数はこれをうまく実行します。

(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アーサーが示すように、1 つの方法です。

考慮すべきもう 1 つの可能性は、destructuringです。具体的にネストされたベクトルバインディング:

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

于 2011-10-12T20:57:37.630 に答える