{-# LANGUAGE RebindableSyntax, NoMonomorphismRestriction, DataKinds, TypeOperators, FlexibleContexts, ConstraintKinds #-} import Prelude hiding (Monad(..)) import Control.Effect import Control.Effect.Reader import GHC.TypeLits {- Examples -} -- foo :: Reader '["x" :-> a, "xs" :-> [a]] [a] foo = do x <- ask (Var::(Var "x")) xs <- ask (Var::(Var "xs")) x' <- ask (Var::(Var "x")) return (x:x':xs) init1 = Ext (Var :-> 1) (Ext (Var :-> [2, 3]) Empty) runFoo = runReader foo init1 -- Examples with subeffecting (need to refine the types a bit to 'run') bar :: (Subset '["x" :-> Int, "xs" :-> [Int]] t) => Reader t [Int] bar = sub foo init2 :: Set '["x" :-> Int, "xs" :-> [Int], "z" :-> a] init2 = Ext (Var :-> 1) (Ext (Var :-> [2, 3]) (Ext (Var :-> undefined) Empty)) runBar = runReader bar init2 -- Note: GHC currently has trouble with --init2a = asSet (append init1 (Ext (Var :-> undefined) Empty)) {- foo_b = do x <- ask (Var::(Var "x")) y <- ask (Var::(Var "x")) return (not x,not y) foo_b = -} -- runFoob = runReader foo_b (Ext (Var :-> 1) (Ext (Var :-> [1,2,3]) Empty))