contains?
我是 clojure 的新手,对将表单用于不同的数据结构有点困惑。
应用于contains
向量、集合或映射的结果正是我所期望的,它测试集合中是否存在键(或索引)。但是当涉及到一个列表时,例如
(def li '(1 2 3)) ; define a list
(contains? li 1) ; returns false !!??
我知道要理解如何contains?
使用列表并不是那么简单,因为它的文档说实现在恒定或日志时间内运行。因此,如果 1 在列表或其索引范围内,那么在少于日志时间的时间内进行测试是没有意义的。但在那种情况下,为什么它不会像使用assoc
列表一样引发异常。在这种assoc
情况下,哲学是相同的 -assoc
不应该应用于列表,因为它不支持对其元素进行足够快的随机访问。
(vals a-map)
我觉得这很不方便,因为clojure中的很多表单都返回一个通用集合作为结果,例如说同一件事的不同方式。
(def a-map {:one 1 :two 2})
(contains? (vals a-map) 1) ; returns false!!
(contains? (set (vals a-map)) 1); returns true!!
所以经过长时间的解释,我的问题是——这个设计背后的理性是什么?当我们想在clojure中测试一个元素是否在一个map的值集中时,我们应该如何原生地说,即更重要的是,我应该如何说服自己,这样我就不会在实践中犯下愚蠢的错误?谢谢!