Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 管道:根据另一个文件的内容打开一个文件_Haskell_Haskell Pipes - Fatal编程技术网

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