Я разрабатываю приложение Yesod, и я сталкиваюсь с ошибкой при попытке использовать sendFlush
и sendChunkBS
внутри forkIO
.Использование sendFlush и sendChunkBS в forkIO
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' не работает, потому что для этого требуется' ConduitM', содержащая 'Data.Void.Void', но вместо этого у меня есть' ConduitFlush'. –