私はYesodアプリケーションを開発中ですが、sendFlush
とsendChunkBS
をforkIO
の内部で使用しようとしているときにエラーが発生しました。forkIOでsendFlushとsendChunkBSを使用する
sendFlush
およびsendChunkBS
はMonad m => Producer m (Flush Builder)
ですが、forkIO
はIO()
が必要です。ここで
はコードです:
respondSource "" $ do
sendFlush
(rid, rwait) <- liftIO $ T.forkIO $
do
let loop = do
output <- liftIO $ SB.recv targetSocket (2^11)
liftIO $ putStrLn $ "SB.recv: " ++ BSC.unpack output
when (not $ BS.null output) $
do
sendChunkBS output
sendFlush
loop
loop
とエラー:
Couldn't match expected type ‘IO a0’
with actual type ‘C.ConduitM
i0 (C.Flush Data.ByteString.Builder.Internal.Builder) m0()’
Relevant bindings include
loop :: C.ConduitM
i0 (C.Flush Data.ByteString.Builder.Internal.Builder) m0()
(bound at app/Main.hs:96:13)
In a stmt of a 'do' block: loop
In the second argument of ‘($)’, namely
‘do { let loop = ...;
loop }’
'runConduit'は' Data.Void.Void'を含む 'ConduitM'を必要とするので動作しませんが、代わりに' ConduitFlush'があります。 –