Ответ 1
Как массивы, имеющие O (1) время для доступа или изменения индексированного элемента, реализованного в Haskell
Они реализованы с помощью примитивных операций в системе времени выполнения для чтения и записи в памяти.
Безопасность побочного действия деструктивной записи в память обеспечивается с помощью монад для линеаризации доступа к изменяемому состоянию.
Рассматривая пакет primitive
для массивов Haskell (в IO
или ST
), вы можете видеть, что реализации в терминах Приоритетов GHC:
-- | Create a new mutable array of the specified size and initialise all
-- elements with the given value.
newArray :: PrimMonad m => Int -> a -> m (MutableArray (PrimState m) a)
newArray (I# n#) x = primitive
(\s# -> case newArray# n# x s# of
(# s'#, arr# #) -> (# s'#, MutableArray arr# #))
-- | Read a value from the array at the given index.
readArray :: PrimMonad m => MutableArray (PrimState m) a -> Int -> m a
readArray (MutableArray arr#) (I# i#) = primitive (readArray# arr# i#)
-- | Write a value to the array at the given index.
writeArray :: PrimMonad m => MutableArray (PrimState m) a -> Int -> a -> m ()
writeArray (MutableArray arr#) (I# i#) x = primitive_ (writeArray# arr# i# x)
То есть, в терминах:
- newArray #
- readArray #
- writeArray #
которые являются примитивными (аппаратно ускоренными) службами для работы в памяти, предоставляемыми языковой средой выполнения.
Механизмы для обеспечения безопасности типов для разрушительных эффектов памяти были введены Haskell в статье Launchbury и Peyton-Jones, Lazy Functional State Threads, которая вводит монаду и примитивыST
для изменяемых массивов.