Эта тема на Haskell обсуждалась много (например, mutable-array-implementation), но я до сих пор не уверен, что является лучшей практикой для случая, требующего частой модификации и произвольного доступа массива/вектора.Mutable, массив/вектор произвольного доступа с высокой производительностью в haskell
Скажите вектор длины 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) может быть использована для эффективного большого количества случайных-доступов , но array/vector должен делать это тоже. Что еще более важно, большое количество изменений по-прежнему необходимо устранить изменчивой структурой, чтобы избежать репликации памяти. Есть ли в Хаскелле изменяемый массив случайных ассесов или вектор? Если используются монады ST/IO, такие элементы управления влияют на производительность в моих настройках?
Вы уверены, что не можете сделать это более элегантно (и, возможно, даже более эффективно!) При приближении ко всей проблеме с более функциональным углом? Почему вам нужно делать эти пошаговые изменения, возможно, вы не можете получить желаемый результат «напрямую», например. с некоторыми ленивыми переадресациями ... – leftaroundabout
'[]' не является типом. 'map h $ zip x [0 ..] '- Я думаю, вы имеете в виду' zipWith h x [0 ..] ', в противном случае вам нужно раскрутить' h'. – leftaroundabout
@leftaroundabout, Обновлен код, хотя реализация 'g' служит только примером. Приближение к нему с более высокой функциональной точки зрения было бы неплохо, но в этом случае было бы сложно. Я думал о кешировании каждой модификации и повторно уплотнять модификации время от времени. Однако для миллионов модификаций такое подражание изменчивой структуре с неперемещаемой структурой, безусловно, намного менее эффективно, чем реальная изменчивая. – Causality