THEff- TH implementation of effects.

Safe HaskellNone
  • FlexibleContexts
  • KindSignatures
  • RankNTypes
  • ExplicitForAll





This version builds its output lazily; for a strict version with the same interface, see Control.THEff.Reader.Strict.

{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}

import Control.THEff
import Control.THEff.Reader

mkEff "CharReader"   ''Reader    ''Char       ''NoEff
mkEff "StrReader"    ''Reader    ''String     ''CharReader

main:: IO ()
main = putStrLn $ runCharReader 'T' $ runStrReader "est" $ do
            c <- ask
            s <- ask
            return $ c:s

Output : Test

Types and functions used in mkEff

data Reader' v e Source

Actually, the effect type - v - Type - the parameter of the effect. - e - mkEff generated type.

data Reader m e o v a Source

Type implements link in the chain of effects. Constructors must be named {EffectName}{Outer|WriterAction|WriterResult} and have a specified types of fields. - m - Or Monad (if use the Lift) or phantom type - stub (if used NoEff). - o - Type of outer effect. - a - The result of mkEff generated runEEEE... function.


ReaderOuter (o m e) 
ReaderAction (Reader' v e) 
ReaderResult a 

type ReaderArgT v = v Source

Type of fourth argument of runEffReader and first argument of runEEEE.

type ReaderResT r = r Source

Result type of runEEEE.

effReader :: EffClass Reader' v e => Reader' v r -> Eff e r Source

This function is used in the mkEff generated runEEEE functions and typically in effect action functions. Calling the effect action.

runEffReader Source


:: forall (t :: * -> *) (u :: (* -> *) -> * -> *) (m :: * -> *) (m1 :: * -> *) (o :: (* -> *) -> * -> *). Monad m 
=> (u t r -> (r -> m (ReaderResT a)) -> m (ReaderResT a))

The outer effect function

-> (Reader m1 e o w a1 -> r)

The chain of effects link wrapper.

-> (r -> Reader t r u v a)

The chain of effects link unwrapper.

-> ReaderArgT v

The initial value of argument of effect.

-> Eff r a1 
-> m (ReaderResT a) 

The main function of the effect implementing. This function is used in the mkEff generated runEEEE functions.

Functions that use this effect

ask :: EffClass Reader' v e => Eff e v Source

Get reader value

asks :: EffClass Reader' r e => (r -> v) -> Eff e v Source

Get and convert the value of the reader