C'è qualcosa che è uguale al contrario di liftIO
? Sto usando websockets e voglio essere in grado di ascoltare i messaggi dal server in un thread separato. Ecco quello che sto facendo:Utilizzo di una monade all'interno della monade IO
import Network.WebSockets
import qualified Data.Text as T
import Control.Monad.IO.Class
import Control.Monad
import Control.Concurrent
import Control.Applicative
printMessages :: WebSockets Hybi00()
printMessages = forever $ do
resp <- receiveDataMessage
liftIO $ print resp
run :: WebSockets Hybi00()
run = do
liftIO . forkIO $ printMessages
forever $ do
line <- liftIO getLine
sendTextData . T.pack $ line
main = connect "0.0.0.0" 8080 "/" run
Così printMessages
ascolta i messaggi dal server e li mantiene stampare. Il problema è che forkIO
si aspetta una funzione che restituisce IO()
. C'è un modo per me di eseguire printMessages
nella monade IO?
[ 'runWithSocket'] (http://hackage.haskell.org/packages/archive/websockets/latest/doc/html/ Network-WebSockets.html # v: runWithSocket) forse? In generale, per passare da un 'MonadIO m' a 'IO', è necessaria una funzione' runXY'. –