gpt4 book ai didi

haskell - 管道 : open a file according to content of another

转载 作者:行者123 更新时间:2023-12-01 23:17:09 26 4
gpt4 key购买 nike

我有这个代码:

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

但这似乎很老套,我希望能够从我在第一个文件的第一行中读到的内容从管道内打开第二个文件。有什么想法吗?

最佳答案

我认为有很多方法可以做到这一点,而无需将 Data.Text.IOPipes 内容混合。正如你所说,它基本上是一个zip。查找第一个文件的第一行的自然方法是使用 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

我认为尝试在“管道内部”做更多事情的方法最终会变得比其值(value)更复杂。特别是,您必须处理 file1 结果为空的情况。 next 基本上是用于在管道 Producer 上进行模式匹配的内容,因此它是基本的管道操作。

所以,从一部分来看,它基本上与像这样的常规文本程序相同

 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

除了它可以正常流式传输之外。

关于haskell - 管道 : open a file according to content of another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39125627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com