Запуск операций монады, обернутых другой монадой

#haskell #yesod

#haskell #yesod

Вопрос:

Учитывая пример websockets, как я могу иметь Handler связанные операции, такие как runDB внутри (например runDB $ selectList ... )

Вот нерабочий пример того, что я хочу сделать:

 chatStream :: WebSocketsT Handler ()
chatStream = do
    users <- liftIO $ runDB $ selectList [] [] :: Handler [Entity User] -- This line is not working
    sendTextData ("Welcome to the chat server, please enter your name." :: Text)
     -- ....
  

Вот ошибка:

 Couldn't match typeHandlerT App IO [Entity User]’
               with ‘ReaderT
                       websockets-0.9.7.0:Network.WebSockets.Connection.Connection
                       Handler
                       t0’
Expected type: ReaderT
                 websockets-0.9.7.0:Network.WebSockets.Connection.Connection
                 Handler
                 t0
  Actual type: Handler [Entity User]
In a stmt of a 'do' block:
  users <- liftIO $ runDB $ selectList [] [] :: Handler [Entity User]
  

Комментарии:

1. Не могли бы вы добавить ошибку, которую вы получаете, к вопросу, пожалуйста

2. О, извините, я добавил сообщение об ошибке.

Ответ №1:

Ответ заключается в том, чтобы использовать lift и не liftIO

users <- lift $ (runDB $ selectList [] [] :: Handler [Entity User])