比如说一个长度为1,000,000的向量。对它的操作涉及根据输入访问其中的一个子集(小的,例如1000),并根据输入修改值。此外,这样的操作要重复执行2,000,000次。任务本身可以使用纯数据结构(例如列表)来实现,但效率非常低:
type Vect = [Int]
f :: Vect -> [[Int]] -> Vect
f x indsList = foldl g x indsList
-- g is just an example of random-access and modifications on the values.
g :: Vect -> [Int] -> Vect
g x inds = map h $ zip x [0..]
where h (x, i) = if i `elem` inds then x !! i + 1 else x !! i
哈希/映射数据结构(例如IntMap)可用于大量随机访问的高效处理,但数组/向量也可以完成。更重要的是,为了避免内存复制,仍需要处理大量修改的可变结构。在Haskell中是否确实有可变、随机访问的数组/向量?如果使用ST/IO单子,这样的控件是否会影响我的性能设置?
[]
不是一种类型。map h $ zip x [0..]
- 我认为你的意思是zipWith h x [0..]
,否则你需要使用uncurry h
。 - leftaroundaboutg
的实现只是一个示例。从更高的函数角度来考虑它会很好,但在这种情况下可能会比较困难。我考虑过缓存每个修改并定期重新压缩修改。然而,对于成千上万的修改,用不可变的结构模拟可变结构肯定比真正的可变结构效率低得多。 - Causality