2011-11-04 89 views
5

我可以看到,可以编写诸如map/sortBy/findIndex之类的函数和一些其他与数组相关的函数(至少可以用整数索引)。这是在标准库中的任何地方完成的,还是我需要推出自己的?Haskell map/sortBy/findIndex等数组而不是列表

我需要在我的程序中使用数组进行就地更新,但也有几个位置我想使用上面的列表函数。在两者之间来回转换最佳解决方案?

(我一直在寻找的阵列是由Data.Array.IArray,我也乐意使用实现此功能的任何其他阵列库)。

+0

“我需要在我的程序中使用数组进行就地更新” - 就地更新是一个实现细节...为什么你真的需要数组?空间限制?时间限制?试图实现一个依赖于就地更新的算法? –

+0

你是对的,这是措辞严厉。我希望能够轻松更新给定索引n处的元素。当然,我可以编写一个函数来完成这个列表,但一般来说效率很低,而且我找不到默认的实现,所以它看起来似乎不是“Haskellish”。我想知道什么“Haskellish”数据结构提供了类似列表的功能,但有效内置了逐索引更新。 –

+0

你应该检查[Data.Sequence](http://hackage.haskell.org/packages/archive/containers/latest/doc/html/Data-Sequence.html)。 –

回答

5

我建议你看看vectorvector-algorithms包。它们包含许多通用操作的非常高效的实现,这些操作在Int索引数组中,可变和不可变变体。

+0

太棒了,这就是我一直在寻找的东西。我也发现了Data.Sequence,你知道这些比较吗? –

+0

@CoreyStaten我们必须在同一个脑波。我刚刚问[Data.Vector替换Data.Sequence?](http://stackoverflow.com/questions/8013275/does-data-vector-replace-data-sequence) –

+1

@CoreyStaten:Data.Sequence实现为手指树,而Data.Vector是一个“真正的”数组。因此,Data.Vector支持常量时间索引,并且通常具有更少的开销,而Data.Sequence支持末端的常量时间操作,并且更适合类队列操作。 – hammar

4

fmap(从Control.Monad)是有点像的map一个通用版本,在任何支持Functor型类的工作。 Array支持,所以你应该可以使用fmap而不是map作为数组。

正如Hammar所说,如果您需要考虑索引数组,可能需要使用矢量算法和矢量算法来解决问题。