如何解决Haskell中固定大小的列表即具有类似列表的API的数组
| Haskell中有一个有效的固定大小列表库吗?我认为当人们只希望数组由自然数(包括零)索引时,“ 0”接口会有些复杂。我想写类似的代码zeroToTwenty :: Int -> FixedList Int
zeroToTwenty 0 = createFixedList 21 []
zeroToTwenty n = zeroToTwenty (n-1) `append` n
我天真的解决方案如下。
编辑:很抱歉缺乏上下文;我想要一个可以分配一次的数据结构,以避免过多的垃圾回收。这是在合并排序的merge
例程中进行的,该例程接受两个已排序的子列表并生成一个已排序的列表。
解决方法
我可能会像Don Stewart建议的那样使用Vector,但是可以通过使用ListLike将带有
IArray
的类似列表的接口使用。
, 如何使用矢量包?它提供了非常有效的可增长向量,具有类似列表的界面和O(1)索引。
, 您可能会考虑使用手指树。它提供了摊销的O(1)缺点,贪心,无条件和不合理以及O(log n)拆分。
, 这是我的幼稚解决方案,
import Data.Array.Diff
newtype FixedList a = FixedList (Int,(DiffArray Int a))
createFixedList n init = FixedList (0,array (0,n - 1) init)
append (FixedList (curr,array)) v = FixedList (curr + 1,array // [(curr,v)])
instance Show a => Show (FixedList a) where
show (FixedList (curr,arr)) = show $ take curr (elems arr)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。