Polysemy: Introduction to Effect definition
In the first log we explained that in the expression:
displayFile :: FilePath -> Sem '[Trace, Embed IO] Int
displayFile path = do
trace $ "Displaying " <> path
content <- embed $ readFile path
embed $ putStr content
return $ length content
trace is emiting an effect of Trace.
trace has the following type:
trace :: forall r. Member Trace r => String -> Sem r ()
and is generated via:
{-# LANGUAGE TemplateHaskell #-}
module EffectDefinitionIntro
( Trace (..),
trace,
)
where
import Data.Kind
import Polysemy
data Trace (m :: Type -> Type) a where
Trace :: String -> Trace m ()
makeSem ''Trace
makeSem will generate something like:
trace :: forall r_a44O. Member Trace r_a44O => String -> Sem r_a44O ()
trace a = emit $ Trace a
So, whenever trace is called, the value is sent to the interpreter.
Note: to keep it short m will be replaced by Sem r during interpretation
See the full the code here.