在clojure中,完全相同的行为是什么?
我对在clojure中,完全相同的行为是什么?,clojure,sequence,identity,lazy-sequences,Clojure,Sequence,Identity,Lazy Sequences,我对clojure中idential?的行为感到非常惊讶 (定义a(地图标识[:a:b])) (相同)(剩余a)(剩余a));假的 知道为什么相同吗?返回false吗?: 由于rest在每次调用时都会创建一个新的seq对象,因此它的结果并不完全相同。然而,以下是: (def r (rest (map identity [:a :b]))) (identical? r r) ;; => true 更新:正如@mfikes指出的,rest并不总是创建新的seq。它在内部调用ISeq.mo
clojure
中idential?
的行为感到非常惊讶
(定义a(地图标识[:a:b]))
(相同)(剩余a)(剩余a));假的
知道为什么相同吗?
返回false吗?:
由于rest
在每次调用时都会创建一个新的seq对象,因此它的结果并不完全相同。然而,以下是:
(def r (rest (map identity [:a :b])))
(identical? r r) ;; => true
更新:正如@mfikes指出的,rest
并不总是创建新的seq。它在内部调用ISeq.more()
,这是按seq类型实现的,可能会对列表、向量、惰性seq等产生不同的结果:
(->> [(map identity [:a :b])
(vector :a :b)
(list :a :b)]
(map #(identical? (rest %) (rest %))))
;; => [false false true]
相同?
是对象相等谓词。如果其参数是相同的对象/基元,则返回true
使用=
覆盖相同?
idential?
在语义依赖于指针相等性时是正确的工具,例如测试文件结束前哨值
切勿使用
相同?
来比较Clojure数据结构。即使是关键字也不能保证相同?
的行为正确。那么,检查一个序列是否是另一个序列的其余部分的建议方法是什么?我的意思是,pointerwise
而不是的值
可能与(every?true?(映射相同?sqa sqb))
?但是,可能需要另外检查长度是否相等。哪里有文件证明rest
创建了一个新的seq?而rest
通常不会创建一个新的seq对象,它会创建这个序列。例如,它没有列出文字。@mfikes True,我调整了答案。
(->> [(map identity [:a :b])
(vector :a :b)
(list :a :b)]
(map #(identical? (rest %) (rest %))))
;; => [false false true]