2016-08-10 2 views
2

Wie speichern Sie eine Datei mithilfe der Bibliothek von Conduit? Ich schaute durch Tutorial der Leitung kann aber nicht scheinen, nichts zu finden, hier ist mein Anwendungsfall:Wie speichern Sie eine Datei mit Conduit?

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

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

Also gibt es zwei Fragen hier:

  1. Ist es sinnvoll lines zu verwenden eine konvertieren String in eine Liste von Strings und dann füttern es sourceList?

  2. Wie soll ich die saveFile Funktion implementieren, so dass, wenn die Saiten xxs vollständig verarbeitet werden, ich es auf die Festplatte schreiben kann?

Antwort

5

Ein kleines minimal Beispiel dafür, was Sie versuchen zu tun mit der conduit Bibliothek: I sind

#!/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" 

Wie soll ich die savefile-Funktion implementieren, so dass, wenn die Saiten XXS vollständig verarbeitet wurde, kann es auf die Festplatte schreiben?

Sie implementieren das in Ihrer myConduit Funktion. Beachten Sie, dass Sie in Ihrem Beispiel den Funktionsaufruf readFile verwenden, der die Datei langsam liest. Conduit bietet eine eigene Abstraktion zum Lesen und Schreiben von Dateien, die Sie verwenden sollten.

Verwandte Themen