effect-monad-0.7.0.0: examples/ImplicitP.hs
{-# LANGUAGE ImplicitParams, DataKinds, RebindableSyntax, TypeOperators #-}
import Prelude hiding (Monad(..))
import Control.Effect
import Control.Effect.Reader
example1 :: (Num a, ?x :: a, ?y :: a) => a -> a
example1 z = ?x + ?y
example1M :: (Num a) => a -> Reader '["?x" :-> a, "?y" :-> a] a
example1M z = do x <- ask (Var::(Var "?x"))
y <- ask (Var::(Var "?y"))
return (x + y + z)
example2 :: (Num a, ?y :: a) => a -> a
example2 = let ?x = 42
in \z -> ?x + ?y + z
example2M :: Num a => Reader '["?x" :-> a] (a -> Reader '["?y" :-> a] a)
example2M = merge (\z -> do x <- ask (Var::(Var "?x"))
y <- ask (Var::(Var "?y"))
return (x + y + z))
with f x = runReader f x
runExample2 = example2M `with` (Ext Var (42 :: Int) Empty)
runExample2' x y z = (example2M `with` (Ext Var (x :: Int) Empty) $ z)
`with` (Ext Var y Empty)
example3M :: Int -> Reader '["?y" :-> Int] Int
example3M =
let x = Ext (Var::(Var "?x")) (42 :: Int) Empty
in runReader (merge (\z -> do x <- ask (Var::(Var "?x"))
y <- ask (Var::(Var "?y"))
return (x + y + z))) x