3

如何使用导管的库保存文件?我浏览了导管的教程,但似乎找不到任何东西,这是我的用例:

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

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

所以这里有两个问题:

  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"

我应该如何实现 saveFile 函数,以便在字符串 xxs 被完全处理后,我可以将其写入磁盘?

你在你的myConduit函数中实现它。请注意,在您的示例中,您使用的是readFile函数调用,它将延迟读取文件。Conduit 为读写文件提供了自己的抽象,你应该使用它。

于 2016-08-10T04:22:39.027 回答