Data.STRef
| Авторские права | (c) The University of Glasgow 2001 |
|---|---|
| Лицензия | в стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | стабильный |
| Переносимость | непереносимый (использует Control.Monad.ST) |
| Безопасный Haskell | Safe |
| Язык | Haskell2010 |
Содержание
Описание
Изменяемые ссылки в (строгой) монаде ST.
STRefs
data STRef s a Исходный код
значение типа STRef s a — это изменяемая переменная в потоке состояния s, содержащая значение типа a
>>> :{
runST (do
ref <- newSTRef "hello"
x <- readSTRef ref
writeSTRef ref (x ++ "world")
readSTRef ref )
:}
"helloworld"
Экземпляры
| Eq (STRef s a) Исходный код |
Равенство указателей. Начиная с: base-2.1 |
Определён в GHC.Internal.STRef Методы(==) :: STRef s a -> STRef s a -> Bool Исходный код (/=) :: STRef s a -> STRef s a -> Bool Исходный код | |
newSTRef :: a -> ST s (STRef s a) Исходный код
Создаёт новую STRef в текущем потоке состояния
readSTRef :: STRef s a -> ST s a Исходный код
Читает значение из STRef
writeSTRef :: STRef s a -> a -> ST s () Исходный код
Записывает новое значение в STRef
modifySTRef :: STRef s a -> (a -> a) -> ST s () Исходный код
Изменяет содержимое STRef.
>>> :{
runST (do
ref <- newSTRef ""
modifySTRef ref (const "world")
modifySTRef ref (++ "!")
modifySTRef ref ("Hello, " ++)
readSTRef ref )
:}
"Hello, world!"
Обратите внимание: modifySTRef не применяет функцию строго. Это означает, что если программа многократно вызывает modifySTRef, но редко использует значение, в памяти будут накапливаться отложенные вычисления, что приведёт к утечке памяти. Это распространённая ошибка при использовании STRef в качестве счётчика. Например, следующий код приведёт к утечке памяти и может вызвать переполнение стека:
>>> import GHC.Internal.Control.Monad (replicateM_)
>>> :{
print (runST (do
ref <- newSTRef 0
replicateM_ 1000 $ modifySTRef ref (+1)
readSTRef ref ))
:}
1000
Чтобы избежать этой проблемы, используйте вместо этого modifySTRef'.
modifySTRef' :: STRef s a -> (a -> a) -> ST s () Исходный код
Строгая версия modifySTRef
Начиная с: base-4.6.0.0
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/Data-STRef.html