Data.STRef
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | Лицензия BSD (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | стабильная |
| Переносимость | непереносимая (использует Control.Monad.ST) |
| Безопасный Haskell | Безопасный |
| Язык | Haskell2010 |
Содержание
Описание
Изменяемые ссылки в (строгом) монаде ST.
STRefs
Значение типа STRef s a — это изменяемая переменная в потоке состояния s, содержащая значение типа a
>>> :{
runST (do
ref <- newSTRef "hello"
x <- readSTRef ref
writeSTRef ref (x ++ "world")
readSTRef ref )
:}
"helloworld"
Примеры реализации
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.12.1/docs/libraries/base-4.21.0.0-8e62/Data-STRef.html