我如何在 Clojure 中迭代两个 Set 以 return 它们的笛卡尔积?

How do I iterate through two Sets in Clojure in order to return their Cartesian product?

所以我接受了两个集合并想遍历它们以便 return 一个包含两个集合的叉积的新集合。

(defn cartesian
  "computes Cartesian product of A and B"

  [A B]
  

  use "set", "for")

我是 Clojure 的新手,所以我不确定为什么要使用“set, for”。 但是 A 和 B 将是集合。现在我想遍历每一个和 return 它们的笛卡尔积。示例:

(cartesian #{1 2} #{3 4 5}) => #{[1 3] [1 4] [1 5] [2 3] [2 4] [2 5]}

虽然我不确定到达那里的步骤。我查看了文档等,但找不到我要找的东西。此处理的其他答案与列表等有关。但我必须使用 2 套。

我正在看的 atm 正在使用 doseq[e A] 并在其中 doseq[x B] 然后将每个向量对 [e x] 添加到一个新集合,然后 return 它.不过,这似乎不是标准的功能解决方案。我在正确的轨道上吗?如何将它添加到新的集合中?

您可以使用 for:

(defn cartesian [A B]
  (set (for [a A
             b B]
         [a b])))

(cartesian #{1 2} #{3 4 5})
;; => #{[2 3] [2 5] [1 4] [1 3] [1 5] [2 4]}

使用cartesian-product from clojure.math.combinatorics. To get exact result you want (set of vectors), use into with map换能器:

(into #{} (map vec) (clojure.math.combinatorics/cartesian-product #{1 2} #{3 4 5}))
=> #{[2 3] [2 5] [1 4] [1 3] [1 5] [2 4]}