2016-08-10 3 views
2

콘딧의 라이브러리를 사용하여 파일을 어떻게 저장합니까? 이 의미는 변환 lines을 사용할 수 있도록 하는가 Conduit을 사용하여 파일을 저장하는 방법은 무엇입니까?

  1. :

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

    그래서 여기에 두 개의 질문이있다 : 나는 도관의 튜토리얼을 통해 보았지만 아무것도 찾을 수없는 것, 여기 내 사용 사례입니다 문자열을 문자열 목록에 넣은 다음 sourceList?

  2. 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 기능을 구현하는 방법을

, I 디스크에 쓸 수 있습니까?

myConduit 함수에 구현했습니다. 귀하의 예제에서는 파일을 느리게 읽을 readFile 함수 호출을 사용하고 있습니다. 도관은 파일을 읽고 쓰는 데 필요한 추상화를 제공하므로 사용해야합니다.

관련 문제