Haskell Can';t通过stdin传递数据以处理使用额外导管生成的数据

Haskell Can';t通过stdin传递数据以处理使用额外导管生成的数据,haskell,haskell-stack,stm,conduit,Haskell,Haskell Stack,Stm,Conduit,在我的程序中,我启动外部进程并通过stdin和stdout与之通信。我通过导管(生产者)从STMsTQueue开始输入。在我决定改变这个版本之前,它一直很有魅力。它在lts中工作得很好,所以问题是sinkHandle的默认行为是在每个数据块之后都不刷新 我已经解决了这个问题,首先移植到Data.conduct.Process.Typed,然后滚动我自己的createSink变体,该变体使用而不是sinkHandle #!/usr/bin/env stack -- stack --resolver

在我的程序中,我启动外部进程并通过
stdin
stdout
与之通信。我通过导管(生产者)从
STM
s
TQueue
开始输入。在我决定改变这个版本之前,它一直很有魅力。它在lts中工作得很好,所以问题是
sinkHandle
的默认行为是在每个数据块之后都不刷新

我已经解决了这个问题,首先移植到
Data.conduct.Process.Typed
,然后滚动我自己的
createSink
变体,该变体使用而不是
sinkHandle

#!/usr/bin/env stack
-- stack --resolver lts-10.4 --install-ghc runghc --package conduit-extra --package stm-conduit
{-# LANGUAGE OverloadedStrings #-}
import Control.Concurrent
import Control.Monad.STM
import Control.Concurrent.STM.TQueue

import           Data.Conduit
import qualified Data.Conduit.Binary       as CB
import qualified Data.Conduit.List         as CL
import           Data.Conduit.Process     (CreateProcess (..),
                                           proc, sourceProcessWithStreams)
import qualified Data.Conduit.TQueue       as CTQ

import qualified Data.ByteString.Char8     as BS
import           Data.Monoid              ((<>))

main :: IO ()
main = do
  putStrLn "Enter \"exit\" to exit."

  q <- open
  putStrLn "connection opened"

  loop q
  where loop q = do
          s <- BS.getLine
          case s of
            "exit" -> return ()
            req -> do
              atomically $ writeTQueue q req
              loop q

open :: IO (TQueue BS.ByteString)
open = do
  req <- atomically newTQueue
  let chat :: CreateProcess
      chat = proc "cat" []

      input :: Producer IO BS.ByteString
      input = toProducer
            $ CTQ.sourceTQueue req
           -- .| CL.mapM_ (\bs -> BS.putStrLn (("queue: " :: BS.ByteString) <> bs))

      output :: Consumer BS.ByteString IO ()
      output = toConsumer
             $ CL.mapM_ BS.putStrLn

  _ <- forkIO (sourceProcessWithStreams chat input output output >> pure ())
  pure req
echo "test" > /proc/<pid of spawned cat>/fd/0