Haskell 管道:根据另一个文件的内容打开一个文件
我有以下代码:Haskell 管道:根据另一个文件的内容打开一个文件,haskell,haskell-pipes,Haskell,Haskell Pipes,我有以下代码: import Pipes import Pipes.Safe import qualified Pipes.Prelude as P import qualified Pipes.Safe.Prelude as P import System.IO import Data.Text as T import Data.Text.IO as TIO import qualified Pipes.Prelude.Text as T someFunc :: IO () someFun
import Pipes
import Pipes.Safe
import qualified Pipes.Prelude as P
import qualified Pipes.Safe.Prelude as P
import System.IO
import Data.Text as T
import Data.Text.IO as TIO
import qualified Pipes.Prelude.Text as T
someFunc :: IO ()
someFunc = runSafeT $
P.withFile file1 ReadMode $ \file1Handle -> do
file2 <- liftIO $ TIO.hGetLine file1Handle
runEffect $
for (P.zip (T.fromHandleLn file1Handle)
(T.readFileLn $ T.unpack file2))
(\(l1,l2) -> do yield l2
yield l1)
>-> T.stdoutLn
导入管道
进口管道,安全
进口合格管道。前奏部分为P
进口合格管道。安全。作为P
导入系统.IO
导入数据。文本为T
将Data.Text.IO导入为TIO
将合格管道.Prelude.Text作为T导入
someFunc::IO()
someFunc=runSafeT$
P.withFile file1 ReadMode$\file1Handle->do
文件2不产生l2
产量(l1)
>->T.stdoutLn
但是它看起来很粗糙,我希望能够从管道中打开第二个文件,从我在第一个文件的第一行中读到的内容。
有什么想法吗?我认为有很多方法可以做到这一点,而不必将
Data.Text.IO
与管道混用。正如你所说,它基本上是一个邮政编码。查找第一个文件的第一行的自然方法是只使用next
,在本例中,它将为您提供与其余行成对的第一行:
someFunc_ = runSafeT $ runEffect $ do
e <- next (T.readFileLn file1)
case e of
Left r -> return r
Right (file2, rest) -> do
let other = T.readFileLn (T.unpack file2)
amalgam = for (P.zip rest other) $ \(l1,l2) -> do
yield l2
yield l1
runEffect $ amalgam >-> T.stdoutLn
除了它能正常流动 我觉得这可能是你能得到的最干净的代码。如果你在这里没有得到答案,试试看,然后把答案贴回这里。谢谢!实际上,next
是这里缺少的元素。
someFunc = do
ls <- fmap T.lines TIO.readFile file1
case ls of
[] -> return ()
file2:rest -> do
ls' <- fmap T.lines (TIO.readFile file1)
forM_ (zip ls ls') $ \(t1,t2) -> do
TIO.putStrLn t1
TIO.putStrLn t2