Haskell に関するこのトピックでは多くのことが議論されましたが (例: mutable-array-implementation )、配列/ベクトルの頻繁な変更とランダム アクセスが必要な場合のベスト プラクティスが何であるかはまだわかりません。
長さ 1,000,000 のベクトルを考えてみましょう。それに対する操作には、入力に基づいてそのサブセット (小さい、たとえば 1000) にアクセスし、入力に基づいて値を変更することが含まれます。さらに、このような操作を200万回繰り返す。タスク自体は、非常に非効率的ですが、たとえば次のようなリストなどの純粋なデータ構造で実装できます。
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
Hash/Map データ構造 (例: IntMap) は効率的な大量のランダム アクセスに使用できますが、配列/ベクトルも使用する必要があります。さらに重要なことに、大量の変更は、メモリの複製を回避するために可変構造によって対処する必要があります。実際、Haskellには変更可能なランダムアクセス配列/ベクトルがありますか? ST/IO モナドが使用されている場合、そのような制御は設定のパフォーマンスに影響しますか?