packages feed

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