Gibt es etwas, das wie das Gegenteil von liftIO
ist? Ich benutze WebSockets und möchte Nachrichten vom Server in einem separaten Thread abhören können. Hier ist, was ich tue:Verwenden einer Monade in der IO-Monade
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
So printMessages
für Nachrichten vom Server zuhört und sich aus immer wieder zu drucken. Das Problem ist, forkIO
erwartet eine Funktion, die IO()
zurückgibt. Gibt es eine Möglichkeit für mich, printMessages
in der IO-Monade zu laufen?
[ 'runWithSocket'] (http://hackage.haskell.org/packages/archive/websockets/latest/doc/html/ Network-WebSockets.html # v: runWithSocket) vielleicht? Im Allgemeinen benötigen Sie eine 'runXY'-Funktion, um von einem' MonadIO m' zu 'IO' zu kommen. –