Haskell 如果我需要一个随机访问的数据结构,Vector是我唯一的好选择吗?

Haskell 如果我需要一个随机访问的数据结构,Vector是我唯一的好选择吗?,haskell,Haskell,如果还有其他好的选择,为什么还没有一个类型类具有随机访问的所有共同特征?然后Vector和其他随机访问数据结构将具有该类型类的实例。不,Vector不是您唯一的“好”选择,这取决于您所说的“好”。例如,Array是一种类似的数据结构,API稍显繁琐,但它也允许为索引集提供更丰富的选择集,并且在实现细节上有所不同,在某些情况下可能会有所帮助(例如,Bools的Array是位图,而Bools的Vector使用每个元素一个字节) 此外,如果在端点上有很多元素的添加和删除,则可能是一个不错的选择(虽然它

如果还有其他好的选择,为什么还没有一个类型类具有随机访问的所有共同特征?然后Vector和其他随机访问数据结构将具有该类型类的实例。

不,
Vector
不是您唯一的“好”选择,这取决于您所说的“好”。例如,
Array
是一种类似的数据结构,API稍显繁琐,但它也允许为索引集提供更丰富的选择集,并且在实现细节上有所不同,在某些情况下可能会有所帮助(例如,
Bool
s的
Array
是位图,而
Bool
s的
Vector
使用每个元素一个字节)

此外,如果在端点上有很多元素的添加和删除,则<<代码> SEQ 类型从<代码>数据。序列< /代码>可能是一个不错的选择(虽然它的随机访问性能从<代码> o(1)在结尾到->代码> O(log n)< /代码>中,粗略地说。 很难说为什么随机访问API没有标准库类型类,但请注意,Haskell在标准库中通常没有这种特殊级别的数据结构API类型类。例如,基本

Map
Set
数据结构API也没有标准类型类例如,即使这些也适用于各种可用的基于散列的映射和集

可用的标准库类型类通常是更高级别的抽象,如
可折叠
可遍历

但是,
lens
包提供了一个索引类型类抽象的集合,因此,例如,
Vector
Array
Seq
都有
Ixed
实例,以便:

v ^? ix 2
如果
v
是上述类型中的任何一种(或一个列表或一系列其他可索引集合),则获取索引为2的
元素。使用这些类型类的可能缺点是,您必须购买整个
lens
生态系统及其语法方法来有效地使用它们


另一种选择是,对于特定的应用程序,编写特定于应用程序的TypeClass通常是一种合理的方法,它封装了在关键数据结构上执行的操作,然后将数据结构实现为这些TypeClass的实例。这可以实现您想象的通用TypeClass的许多好处,但是可以比预制的类型类和实例更灵活,而不需要执行太多的工作。

我猜“随机访问的常见特征”无法精确定义,因此很难在所有图书馆贡献者之间达成一致意见。当然,你可以提出你自己的课程。+1到最后一段。有时,在这样做的时候,奇迹般的新结构出现了,让我能够将我的程序推广到超出我最初想象的范围。@luqui&@KABuhr:假设我写了一篇f使用向量的函数。假设该函数只使用
长度
(!)
(索引)函数。你们是在鼓吹我把这两个函数放在一个单独的类型类
HasLengthAndIndexing
?或者甚至是两个长度
可索引的类型类
?这是非常普遍的。但我想人们可能会走得太远。你们能补充一些想法吗?我想到的是特定于应用程序的类型C包含一致操作集的类,而不是包含最小必需操作集的每个函数类型类。(后一种方法在某些情况下很有用,但不是我所建议的。)退一步说,我反对对大多数Haskell编程进行过早的抽象。如果您有一个使用向量的函数,我建议您使用
Vector
s编写它。如果您后来发现它有助于泛化,那么请重构它,使用为您的程序量身定制的
RandomAccess
typeclass。@K.a.Buhr是的!Haskell编程是一门对话艺术。当你注意到一个模式(或者当它在美学上令人愉悦时),写一些,重构和抽象,写更多,抽象更多——像考古学家一样揭示平衡,而不是出于自我的愿望将最佳设计付诸实施。