gpt4 book ai didi

clojure - 在clojure中,为什么空列表的类型与非空列表的类型不同?

转载 作者:行者123 更新时间:2023-12-02 13:34:26 26 4
gpt4 key购买 nike

我想判断两个值是否类型相同,但是发现空列表的类型是clojure.lang.PersistentList$EmptyList而不是clojure.lang.PersistentList

user=> (def la '())
#'user/la
user=> (def lb '(1 2))
#'user/lb
user=> (def t (map type [la lb]))
#'user/t
user=> t
(clojure.lang.PersistentList$EmptyList clojure.lang.PersistentList)
user=> (apply = t)
false
user=>

所以,我想知道为什么空列表的类型与非空列表的类型不同,以及判断两个事物是否具有相同类型的正确方法是什么?

最佳答案

不要依赖 Clojure 数据结构的具体类型。它们是未记录的实现细节,您无法保证它们在 Clojure 的 future 版本中不会更改。

依赖抽象(例如由 IPercientListISeq 接口(interface)定义的抽象)更安全。这些不太可能以可能破坏代码的方式进行更改(我的理解是,在抽象方面,Rich Hickey 非常注重向后兼容性。如果您依赖具体的实现,我相信他会说这是您自己的错如果事情坏了)

但是更好,您应该使用 clojure.core 中的函数,例如 seq?list? ,具体取决于您想要检测的内容。这些不仅可以长期保持向后兼容性,而且还有机会在非 JVM 版本的 Clojure(例如 ClojureScript)上正常工作。

关于clojure - 在clojure中,为什么空列表的类型与非空列表的类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com