Clojure,包含?/ get on a set

时间:2015-09-29 07:00:01

标签: clojure

contains?告诉您get是否会成功。我还想认为get会返回来自集合的内容,在本例中为set

(def all-match-okay #{
                 #{[3 0] [0 5]}
                 #{[2 4] [0 5]}})

(defn joinable? [b1 b2]
  (let [in-a-set (set [b1 b2])
        res (contains? all-match-okay in-a-set)]
    res))

(defn join [b1 b2]
  (let [in-a-set (set [b1 b2])
        res (get all-match-okay in-a-set)]
    (first res)))

(defn -main
  [& args]
  (println (joinable? [0 5] [3 0]))
  (println (join [0 5] [3 0]))
  )  

如果您运行上述代码,则true将从joinable?返回,但[0 5]将从join返回。这意味着集合中的内容不会被返回,而是返回了匹配的内容。

我确定这里发生的事情在理论上是正确的(毕竟如果它们匹配则无论返回哪个都无关紧要)。但另一方面,返回集合中的实际内容在理论上也会很好。不是吗?

1 个答案:

答案 0 :(得分:2)

问题是(first res)电话。你得到一个集合的随机元素,因为它们没有被排序。一个(希望可重复的)例子:

(second (apply hash-set (range 32)))
=> 7 (instead of 1)

clojure.core附带sorted set。第三方库(例如flatland)提供有序集。