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

时间:2017-06-27 21:01:04

标签: haskell

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

1 个答案:

答案 0 :(得分:13)

不,for i in `cat file1`; do for j in `cat file2`; do echo $i-$j done done 不是你唯一的“好”选择,取决于你所说的“好”。例如,Vector是一个类似的数据结构,具有稍微繁琐的API,但它也允许为索引集提供更丰富的选择,并且在实现细节方面有所不同,在某些情况下可能会有所帮助(例如, Array Array的{​​{1}}是位图,而Bool的{​​{1}}每个元素使用一个字节。)

此外,如果两端添加和删除元素很多,那么来自Vector的{​​{1}}类型可能是一个不错的选择(尽管其随机访问性能与Bool不同在中间的Seq,粗略地说。)

很难确定为什么没有随机访问API的标准库类型类,但请注意,Haskell通常在标准库中没有这种特定级别的数据结构API类型类。例如,基础Data.SequenceO(1)数据结构API没有标准类型类,即使这些也适用于各种基于散列的地图和可用的集合。

可用的标准库类型类通常是更高级别的抽象,例如O(log n)Map

但是,Set包提供了索引类型类抽象的集合,例如,FoldableTraversablelensIxed个实例这样:

Vector
如果Array是上述任何一种类型(或列表或其他可索引集合的主机),则

获取索引为2的元素Seq。使用这些类型类的可能缺点是你必须购买整个v ^? ix 2 生态系统及其语法方法才能有效地使用它们。

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