Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure中,完全相同的行为是什么?_Clojure_Sequence_Identity_Lazy Sequences - Fatal编程技术网

在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]