2016-08-10 4 views
2

コンジットのライブラリを使用してファイルを保存するにはどうすればよいですか?私は、導管のチュートリアルを見えたが、何かを見つけることができないよう、ここに私のユースケースである:Conduitを使用してファイルを保存するにはどうすればよいですか?

  1. それが変換するlinesを使用しても意味がない:

    main :: IO() 
    main = do 
        xxs <- lines <$> (readFile filePath) 
        sourceList xxs =$ pipe $$ saveFile 
    
    pipe :: Monad m => Conduit String m String 
    pipe = undefined 
    

    は、だからここ2つの質問があります文字列を 文字列のリストに入力し、sourceListに入力しますか?文字列 xxsが完全に処理されたとき、私はそれをディスクに書き込むことができるように?私はsaveFile機能を実装する必要がありますどのように

答えて

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

関連する問題