Haskell/Polysemy print to StdOut

176 Views Asked by At

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.

1

There are 1 best solutions below

0
On

I managed to resolve this issue by understanding that running traceToStdout followed by runM was giving me an IO, whereas ignoring it gave me a Handler.

I was able to fix it by adding liftIO to the end, lifting the IO Monad into the Handler monad:

serverHandler = hoistServer api interpretServer apiServer
  where
    interpretServer :: Sem '[Trace, Embed IO] a -> Handler a
    interpretServer sem =
      sem
        |> traceToStdout
        |> runM
        |> liftIO