【问题标题】:Why so many function in clojure have different behavior for list and vector and how it can be changed?为什么 clojure 中的这么多函数对列表和向量有不同的行为以及如何更改它?
【发布时间】:2013-06-25 06:53:27
【问题描述】:

在 clojure 中,您有几个函数对向量和列表有不同的作用。我有两个问题。

1) 它有什么用? 我相信clojure的创造者有很好的理由这样做,但我不知道。

2) 如何使这些函数的类型安全变体无论数据是在列表还是向量中都将以相同的方式运行?

定义的函数 conj 具有以下行为

(conj [1 2 3] 4)
[1 2 3 4]

(conj '(1 2 3) 4)
(4 1 2 3)

我想要一个具有以下行为的函数 my-conj

(my-conj [1 2 3] 4)
[1 2 3 4]

(my-conj '(1 2 3) 4)
(1 2 3 4)

还有其他功能(cons、into、peek、pop)具有相同的行为,所以如果这种结构可以很容易地适应所有这些功能,那就太好了。

【问题讨论】:

标签: clojure


【解决方案1】:

由于数据结构的实现方式,让它们的行为稍有不同会更有效。例如,在列表的开头添加一个项目很容易(概念上只是将项目链接到现有列表的开头),但很难在向量的开头添加一个项目(从概念上将现有的项目向上移动索引),反之亦然。

替代方案是一致的 conj,但最坏情况的复杂性要差得多。

(有关性能保证表,请参阅http://www.innoq.com/blog/st/2010/04/clojure_performance_guarantees.html

【讨论】:

    【解决方案2】:

    从表面上看,我理解这看起来很奇怪,但我认为这个想法是 conj 执行默认的、最简单的“将元素添加到此集合”操作。向量和列表的构建方式不同,需要不同类型的默认操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多