Spec-Zone.ru › Haskell 7

Control.Monad.Trans.Cont

Авторские права (c) Университет Глазго 2001
Лицензия BSD (см. файл LICENSE)
Поддерживающий ross@soi.city.ac.uk
Устойчивость экспериментальная
Переносимость переносимый
Safe Haskell Безопасный
Язык Haskell98

Содержание

  • Моноид Cont
    • Ограниченные продолжения
  • Трансформатор моноида ContT
    • Ограниченные продолжения
  • Поднятие других операций

Описание

Моноиды продолжения.

Операторы ограниченных продолжений взяты из учебника Кеничи Асаи и Олега Киселёва на 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)

runCont Источник

Аргументы

:: Cont r a

вычисление продолжения (Cont).

-> (a -> r)

конечное продолжение, которое производит конечный результат (часто id).

-> r

Результат выполнения вычисления CPS с заданным конечным продолжением. (Обратное cont)

evalCont :: Cont r r -> r Источник

Результат выполнения вычисления CPS с тождественным конечным продолжением.

  • evalCont (return x) = x

mapCont :: (r -> r) -> Cont r a -> Cont r a Источник

Применение функции для преобразования результата вычисления с передачей продолжения.

  • runCont (mapCont f m) = f . runCont m

withCont :: ((b -> r) -> a -> r) -> Cont r a -> Cont r b Источник

Применение функции для преобразования продолжения, переданного в вычисление CPS.

  • runCont (withCont f m) = runCont m . f

Ограниченные продолжения

reset :: Cont r r -> Cont r' r Источник

reset m ограничивает продолжение любого shift внутри m.

  • reset (return m) = return m

shift :: ((a -> r) -> Cont r r) -> Cont r a Источник

shift f захватывает продолжение до ближайшего окружающего reset и передает его f:

  • reset (shift f >>= k) = reset (f (evalCont . k))

Трансформатор моноида ContT

newtype ContT r m a Источник

Трансформатор моноида продолжения. Может использоваться для добавления обработки продолжения в другие моноиды.

Конструкторы

ContT

Поля

runContT :: (a -> m r) -> m r

Примеры реализации

MonadTrans (ContT r)
Monad (ContT r m)
Functor (ContT r m)
Applicative (ContT r m)
MonadIO m => MonadIO (ContT r m)

evalContT :: Monad m => ContT r m r -> m r Источник

Результат выполнения вычисления CPS с return в качестве конечного продолжения.

  • evalContT (lift m) = m

mapContT :: (m r -> m r) -> ContT r m a -> ContT r m a Источник

Применение функции для преобразования результата вычисления с передачей продолжения.

  • runContT (mapContT f m) = f . runContT m

withContT :: ((b -> m r) -> a -> m r) -> ContT r m a -> ContT r m b Источник

Применение функции для преобразования продолжения, переданного в вычисление CPS.

  • runContT (withContT f m) = runContT m . f

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.

  • resetT (lift m) = lift m

shiftT :: Monad m => ((a -> m r) -> ContT r m r) -> ContT r m a Источник

shiftT f захватывает продолжение до ближайшего окружающего resetT и передает его f:

  • resetT (shiftT f >>= k) = resetT (f (evalContT . k))

Поднятие других операций

liftLocal :: Monad m => m r' -> ((r' -> r') -> m r -> m r) -> (r' -> r') -> ContT r m a -> ContT r m a Source

liftLocal ask local возвращает функцию local для ContT r m.

© 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

Spec-Zone.ru

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