Control.Monad.Trans.Cont
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD (см. файл LICENSE) |
| Поддерживающий | ross@soi.city.ac.uk |
| Устойчивость | экспериментальная |
| Переносимость | переносимый |
| Safe Haskell | Безопасный |
| Язык | Haskell98 |
Содержание
Описание
Моноиды продолжения.
Операторы ограниченных продолжений взяты из учебника Кеничи Асаи и Олега Киселёва на CW 2011, «Вводное программирование со shift и reset» (http://okmij.org/ftp/continuations/#tutorial).
Моноид Cont
type Cont r = ContT r Identity Источник
Моноид продолжения. Cont r a — это вычисление CPS, которое генерирует промежуточный результат типа a внутри вычисления CPS, конечный тип результата которого r.
Функция return просто создает продолжение, которое передает значение дальше.
Оператор >>= добавляет связанную функцию в цепочку продолжений.
cont :: ((a -> r) -> r) -> Cont r a Источник
Построение вычисления с передачей продолжения из функции. (Обратное runCont)
Аргументы
| :: Cont r a | вычисление продолжения ( |
| -> (a -> r) | конечное продолжение, которое производит конечный результат (часто |
| -> r |
Результат выполнения вычисления CPS с заданным конечным продолжением. (Обратное cont)
evalCont :: Cont r r -> r Источник
Результат выполнения вычисления CPS с тождественным конечным продолжением.
mapCont :: (r -> r) -> Cont r a -> Cont r a Источник
Применение функции для преобразования результата вычисления с передачей продолжения.
withCont :: ((b -> r) -> a -> r) -> Cont r a -> Cont r b Источник
Применение функции для преобразования продолжения, переданного в вычисление CPS.
Ограниченные продолжения
reset :: Cont r r -> Cont r' r Источник
reset m ограничивает продолжение любого shift внутри m.
shift :: ((a -> r) -> Cont r r) -> Cont r a Источник
shift f захватывает продолжение до ближайшего окружающего reset и передает его f:
Трансформатор моноида ContT
Трансформатор моноида продолжения. Может использоваться для добавления обработки продолжения в другие моноиды.
Примеры реализации
evalContT :: Monad m => ContT r m r -> m r Источник
Результат выполнения вычисления CPS с return в качестве конечного продолжения.
mapContT :: (m r -> m r) -> ContT r m a -> ContT r m a Источник
Применение функции для преобразования результата вычисления с передачей продолжения.
withContT :: ((b -> m r) -> a -> m r) -> ContT r m a -> ContT r m b Источник
Применение функции для преобразования продолжения, переданного в вычисление CPS.
callCC :: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a Источник
callCC (call-with-current-continuation) вызывает свою функцию-аргумент, передавая ей текущее продолжение. Предоставляет механизм продолжения-escape для использования с моноидами продолжения. Продолжения-escape позволяют прервать текущее вычисление и немедленно вернуть значение. Они достигают аналогичного эффекта, что и throwE и catchE внутри моноида ExceptT. Преимущество этой функции по сравнению с вызовом return состоит в том, что она делает продолжение явным, что позволяет большей гибкости и лучшему контролю.
Стандартный прием с callCC — предоставление лямбда-выражения для именования продолжения. Затем вызов именованного продолжения в любом месте области видимости выйдет из вычисления, даже если оно находится на нескольких уровнях вложенных вычислений.
Ограниченные продолжения
resetT :: Monad m => ContT r m r -> ContT r' m r Источник
resetT m ограничивает продолжение любого shiftT внутри m.
shiftT :: Monad m => ((a -> m r) -> ContT r m r) -> ContT r m a Источник
shiftT f захватывает продолжение до ближайшего окружающего resetT и передает его f:
Поднятие других операций
liftLocal :: Monad m => m r' -> ((r' -> r') -> m r -> m r) -> (r' -> r') -> ContT r m a -> ContT r m a Source
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/transformers-0.4.2.0/Control-Monad-Trans-Cont.html