Spec-Zone.ru › Haskell 9

Data.STRef

Авторские права (c) The University of Glasgow 2001
Лицензия в стиле BSD (см. файл libraries/base/LICENSE)
Сопровождающий libraries@haskell.org
Стабильность стабильный
Переносимость непереносимый (использует Control.Monad.ST)
Безопасный Haskell Safe
Язык Haskell2010

Содержание

  • STRefs

Описание

Изменяемые ссылки в (строгой) монаде 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API