I am using Haskell's Polysemy library and having a huge headache just trying to print to StdOut. Here's my code:
apiServer :: (Member Trace r, Member (Embed IO) r) => ServerT Api (Sem r)
apiServer = test :<|> values
where
test :: Sem r String
test = do
return "Server up!"
values :: Member Trace r => Sem r Value
values =
do
_ <- trace (show dummyValues)
return dummyValues
api :: Proxy Api
api = Proxy
serverHandler :: Handler [Char] :<|> Handler Value
serverHandler = hoistServer api interpretServer apiServer
where
interpretServer :: Sem '[Trace, Embed IO] a -> Handler a
interpretServer sem =
sem
|> traceToStdout
|> runM
The error is
• Couldn't match expected type: Handler a
with actual type: IO a
• In the expression: sem |> traceToStdout |> runM
In an equation for ‘interpretServer’:
interpretServer sem = sem |> traceToStdout |> runM
In an equation for ‘serverHandler’:
serverHandler
= hoistServer api interpretServer apiServer
where
interpretServer :: Sem '[Trace, Embed IO] a -> Handler a
interpretServer sem = sem |> traceToStdout |> runM
• Relevant bindings include
sem :: Sem '[Trace, Embed IO] a (bound at src/Lib.hs:58:21)
interpretServer :: Sem '[Trace, Embed IO] a -> Handler a
(bound at src/Lib.hs:58:5)
I know I am supposed to interpret the Embed
thing somehow, but I can't figure out how. I tried runEmbedded
but I don't know what to put in the first arg.
I managed to resolve this issue by understanding that running
traceToStdout
followed byrunM
was giving me anIO
, whereas ignoring it gave me aHandler
.I was able to fix it by adding
liftIO
to the end, lifting theIO
Monad into theHandler
monad: