conduit
ライブラリを使用してやろうとしていることの小さな最小限の例:
#!/usr/bin/env stack
{- stack
--resolver lts-6.7
--install-ghc
runghc
--package conduit-extra
--package resourcet
--package conduit
-}
import Data.Conduit.Binary (sinkFile, sourceFile)
import Control.Monad.Trans.Resource
import Data.Conduit (($$), await, Conduit, (=$), yield)
import Data.Monoid ((<>))
import Control.Monad.IO.Class
myConduit = do
str <- await
case str of
Just x -> do
liftIO $ print "some processing"
yield x
myConduit
Nothing -> return ()
saveFile :: FilePath -> FilePath -> IO ()
saveFile f1 f2 = runResourceT $ sourceFile f1 $$ myConduit =$ sinkFile f2
main :: IO ()
main = saveFile "test.txt" "atest.txt"
文字列 xxs が完全に処理されたときにディスクに書き込めるようにするには、saveFile 関数をどのように実装すればよいですか?
それを関数に実装しますmyConduit
。あなたの例ではreadFile
、ファイルを遅延して読み取る関数呼び出しを使用していることに注意してください。コンジットは、ファイルの読み取りと書き込みのための独自の抽象化を提供します。それを使用する必要があります。