MyNixOS website logo
Description

Wrap functions such as catch around different monads.

This package allows you to invoke a function on one monadic type passing it an argument of a different monadic type. The canonical example is using a function such as finally or bracket to ensure cleanup is run regardless of any exceptions thrown by a computation such as x :: ReaderT
MyConfig IO b. If x uses the ReaderT function ask, it cannot be re-written to run in the IO monad, and hence cannot be executed with a construction like lift (x`finally` cleanup). Instead, you must use the wrap method, provided by module Control.Monad.Wrap in this package.

This package contains several other modules: Control.Monad.WrapIO wraps an IO action through multiple monad transformers. Control.Monad.WrapBase generalizes the concept to other base monads besides IO. Control.Monad.MultiWrap implements mwrap, a method that behaves like wrap but allows wrapping through multiple nested layers of monad transformer. The module Control.Monad.MultiLift provides mlift, a version of lift that similarly lifts through multiple nested monad transformers.

Since this library was first released, an alternate approach was introduced by the monad-control package. monad-control is now the standard. However, this package, monad-wrap, stands as an example of accomplishing similar goals with fewer language extensions and less complexity. In particular, monad-wrap does not use RankNTypes or TypeFamilies, both required by monad-control. Moreover, monad-wrap is much smaller--no MonadWrap method requires more than one line of code. Both monad-wrap and monad-control require UndecidableInstances, but Control.Monad.Wrap itself does not require that extension, only the other modules.

Metadata

Version

0.1

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows