3

コンジットのライブラリを使用してファイルを保存するにはどうすればよいですか? コンジットのチュートリアルを調べましたが、何も見つからないようです。これが私のユースケースです:

main :: IO ()
main = do
  xxs  <- lines <$> (readFile filePath)
  sourceList xxs =$ pipe $$ saveFile

pipe :: Monad m => Conduit String m String
pipe = undefined

ここで 2 つの質問があります。

  1. lines文字列を文字列のリストに変換してから にフィードするために使用するのは理にかなっていsourceListますか?

  2. 文字列が完全に処理されsaveFileたときにディスクに書き込むことができるようにするには、関数 をどのように実装すればよいですか?xxs

4

1 に答える 1

5

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、ファイルを遅延して読み取る関数呼び出しを使用していることに注意してください。コンジットは、ファイルの読み取りと書き込みのための独自の抽象化を提供します。それを使用する必要があります。

于 2016-08-10T04:22:39.027 に答える