2011-11-04 41 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所說,如果您需要考慮索引數組,可能需要使用矢量算法和矢量算法來解決問題。

相關問題