packages feed

effect-monad-0.6: examples/ImplicitP.hs

{-# LANGUAGE ImplicitParams, DataKinds, RebindableSyntax, TypeOperators #-}

import Prelude hiding (Monad(..))
import Control.Effect
import Control.Effect.Reader

foo :: (Num a, ?x :: a, ?y :: a) => a -> a
foo z = ?x + ?y

fooM :: (Num a) => a -> Reader '["?x" :-> a, "?y" :-> a] a
fooM z = do x <- ask (Var::(Var "?x"))
            y <- ask (Var::(Var "?y"))
            return (x + y + z)

foo' :: (Num a, ?y :: a) => a -> a
foo' = let ?x = 42
       in \z -> ?x + ?y + z

fooM' :: Num a => Reader '["?x" :-> a] (a -> Reader '["?y" :-> a] a)
fooM' = merge (\z -> do x <- ask (Var::(Var "?x"))
                        y <- ask (Var::(Var "?y"))
                        return (x + y + z))

with f x = runReader f x

fooM'' = fooM' `with` (Ext (Var :-> 42) Empty)

sum2 :: Num a => a -> Reader '["?y" :-> a] a
sum2 = let x = (Ext ((Var::(Var "?x")) :-> 42) Empty) 
       in runReader (merge (\z -> do x <- ask (Var::(Var "?x"))
                                     y <- ask (Var::(Var "?y"))
                                     return (x + y + z))) x