Control.Monad.ST
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | экспериментальная |
| Переносимость | непереносимая (требует универсального квантификатора для runST) |
| Безопасный Haskell | Достоверный |
| Язык | Haskell2010 |
Содержание
Описание
Эта библиотека предоставляет поддержку для жестких потоков состояния, как описано в статье PLDI '94 Джона Лончбери и Саймона Пейтона Джонса Ленивые функциональные потоки состояния.
Ссылки (переменные), которые могут быть использованы внутри моноида ST, предоставляются в Data.STRef, а массивы — в Data.Array.ST.
Моноид ST
Жесткий моноид ST. Моноид ST позволяет выполнять деструктивные обновления, но является вызываемым (в отличие от IO). Вычисление типа ST s a возвращает значение типа a, и выполняется в "потоке" s. Параметр s — это либо
Он служит для поддержания отдельных внутренних состояний различных вызовов runST друг от друга и от вызовов stToIO.
Операции >>= и >> являются жёсткими по отношению к состоянию (хотя и не по отношению к значениям, хранящимся в состоянии). Например,
runST (writeSTRef _|_ v >>= f) = _|_
Примеры реализации
| Монад (ST s) | С момента: base-2.1 |
Определено в GHC.ST Методы(>>=) :: ST s a -> (a -> ST s b) -> ST s b Исходный код (>>) :: ST s a -> ST s b -> ST s b Исходный код return :: a -> ST s a Исходный код | |
| Функтор (ST s) | С момента: base-2.1 |
Определено в GHC.ST | |
| MonadFix (ST s) | С момента: base-2.1 |
Определено в Control.Monad.Fix Методыmfix :: (a -> ST s a) -> ST s a Исходный код | |
| MonadFail (ST s) | С момента: base-4.11.0.0 |
Определено в GHC.ST Методыfail :: Строка -> ST s a Исходный код | |
| Применимо (ST s) | С момента: base-4.4.0.0 |
Определено в GHC.ST Методыpure :: a -> ST s a Исходный код (<*>) :: ST s (a -> b) -> ST s a -> ST s b Исходный код liftA2 :: (a -> b -> c) -> ST s a -> ST s b -> ST s c Исходный код (*>) :: ST s a -> ST s b -> ST s b Исходный код (<*) :: ST s a -> ST s b -> ST s a Исходный код | |
| Вывод (ST s a) | С момента: base-2.1 |
Определено в GHC.ST МетодыshowsPrec :: Целое -> ST s a -> ShowS Исходный код show :: ST s a -> Строка Исходный код showList :: [ST s a] -> ShowS Исходный код | |
| Полугруппа a => Полугруппа (ST s a) | С момента: base-4.11.0.0 |
Определено в GHC.ST Методы(<>) :: ST s a -> ST s a -> ST s a Исходный код sconcat :: Непустой (ST s a) -> ST s a Исходный код stimes :: Целочисленное b => b -> ST s a -> ST s a Исходный код | |
| Моноид a => Моноид (ST s a) | С момента: base-4.11.0.0 |
Определено в GHC.ST Методыmempty :: ST s a Исходный код mappend :: ST s a -> ST s a -> ST s a Исходный код mconcat :: [ST s a] -> ST s a Исходный код | |
runST :: (forall s. ST s a) -> a Source
Возвращает значение, вычисленное в потоке состояния. forall гарантирует, что внутреннее состояние, используемое в вычислении ST, недоступно остальной части программы.
fixST :: (a -> ST s a) -> ST s a Source
Позволяет использовать результат вычисления ST (лениво) внутри вычисления.
Обратите внимание, что если f строгое, fixST f = _|_.
Преобразование ST в IO
RealWorld — глубоко магическая сущность. Она примитивна, но не неподнята (поэтому ptrArg). Мы никогда не манипулируем значениями типа RealWorld; оно используется только в системе типов для параметризации State#.
stToIO :: ST RealWorld a -> IO a Source
Встраивает строгий поток состояния в действие IO. Параметр RealWorld указывает, что внутреннее состояние, используемое в вычислении ST, является специальным, предоставленным монадой IO, и, таким образом, отличается от состояний, используемых вызовами runST.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/Control-Monad-ST.html