gpt4 book ai didi

clojure - 为什么不能 RSeq 一个 RSeq?

转载 作者:行者123 更新时间:2023-12-02 21:10:38 24 4
gpt4 key购买 nike

user=> (rseq [:a :b])
(:b :a)
user=> (rseq (rseq [:a :b]))
ClassCastException clojure.lang.APersistentVector$RSeq cannot be cast to
clojure.lang.Reversible clojure.core/rseq (core.clj:1532)

为什么 rseq 无法接受先前调用 rseq 的结果?

我在文档字符串中读到参数必须是(实际上,“可以是”)向量或排序映射,上面显示它不能是 RSeq,所以我已经知道了。我想知道的是:这个限制有充分的理由吗?这只是一个疏忽,还是这个限制提供了一些重要的好处?

此外,除了从不调用 rseq 之外,是否有方便的解决方法?当您从一个函数返回 RSeq 时,很难知道其他地方的其他函数是否会调用它的 rseq

我问这个问题是因为看到我的代码抛出 such surprising reasons 的异常令人沮丧。如果我知道为什么这是有道理的,我可能就不太可能犯这种错误和类似的错误。

最佳答案

您无法在 seq 上调用 rseq,因为您需要一个具有恒定时间随机访问的输入集合来满足 rseq 的恒定时间性能特征,并且 seq只提供自下而上的高效访问(迭代)。

对 rseq 的结果调用 rseq 不能通过特殊情况返回原始集合,因为原始集合从来都不是 seq。如果在 RSeq 上调用 rseq 会返回 (seq coll),那么就无法直接支持 (rseq (drop x (rseq coll) ))。可能正是这些复杂性使得语言实现者根本无法支持“递归”rseq。

如果您需要通用反转功能,请使用reverse - 这会更慢。如果可以的话,您可能只想保留对 (seq coll)(rseq coll) 的引用(如果您需要两者)。

关于clojure - 为什么不能 RSeq 一个 RSeq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37431321/

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