5

の反対のようなものはありliftIOますか?私は websockets を使用しており、別のスレッドでサーバーからのメッセージをリッスンできるようにしたいと考えています。これが私がやっていることです:

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

したがってprintMessages、サーバーからのメッセージをリッスンし、それらを出力し続けます。問題は、forkIOを返す関数を期待することですIO ()printMessagesIO モナドで実行する方法はありますか?

4

1 に答える 1

5

私がこの権利を理解している場合、別のスレッドでメッセージを受信したいのは、メインスレッドがユーザー入力の送信を待機しているためです。

ドキュメントを見ると、スレッドの役割を逆にすると、より簡単に処理できるように思えます。つまり、メイン スレッドで受信し、他のスレッドから非同期で送信します。

次にgetSink :: Protocol p => WebSockets p (Sink p)、フォークする前にシンクをつかむために を使用できます。これを使用しsendSink :: Sink p -> Message p -> IO ()IO、モナドを混在させるという問題全体を回避できます。

つまり、コードを次のように再構築します。

sendMessages :: Sink Hybi00 -> IO ()
sendMessages sink = forever $ do
    line <- getLine
    let msg = textData . T.pack $ line
    sendSink sink msg

run :: WebSockets Hybi00 ()
run = do
    sink <- getSink
    liftIO . forkIO $ sendMessages sink
    forever $ do
      resp <- receiveDataMessage 
      liftIO $ print resp

main = connect "0.0.0.0" 8080 "/" run
于 2013-05-08T22:39:31.513 に答える