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
traceToStdoutfollowed byrunMwas giving me anIO, whereas ignoring it gave me aHandler.I was able to fix it by adding
liftIOto the end, lifting theIOMonad into theHandlermonad: