在Haskell中读取文本文件并分别处理其中的每一行



如何使用Haskell语言编写包含以下详细信息的代码:

  • 首先读取文本文件。
  • 然后,在循环中处理此文本文件的每一行上的函数。
  • 最后将每个处理过的行写入输出文本文件。

注: 之前在输入文件中,行是分开和组织的,可以进行处理。

这是我对上述细节的意思的代码。事实上,我希望您指导我了解下面代码中的?部分,并帮助我根据我在注释--/部分中提到的内容完成此代码中的?部分。

main :: IO ()
main = do
 file:_ <- getArgs
 gr     <- readPGF file
 content <- readFile "input.txt"
 loop gr content

loop :: PGF -> String -> IO ()
loop gr content = ?
 -- ln <- lines content
 -- if ln == EndOfFile then putStrLn "bye" else do 
 -- appendFile "output.txt" $function gr line
 -- loop gr content
function :: PGF -> String -> String
function gr s = *functions body*

感谢您的回答。

编辑 1:

试图在我的代码中构造一个循环,我写了以下代码:

module Main where
import PGF
import System.Environment
import System.IO
main :: IO ()
main = do
 file:_ <- getArgs
 gr     <- readPGF file
 content <- readFile "testCasePF.txt"
 line <- lines content
 loop gr line

loop :: PGF -> String -> IO ()
loop g x:y = do    
 if x == "quit" then putStrLn "bye" else do
   appendFile "output.txt" $function g x      
   loop gr y
function :: PGF -> String -> String
function gr s = *function body*

但是钢铁我在尝试编译它时遇到了问题,并且我发现了一个无法修复的错误: parse error in pattern: loop我希望你帮助我解决这个问题。

我建议将我们的输入、处理和输出分成单独的函数。 特别是,这提供了所有数据处理都是纯的,而不是混合处理和文件 IO(这称为关注点分离):

readData :: FilePath -> IO (PGF, String)
readData file = do
    gr <- readPGF file
    content <- readFile "input.txt"
    return (gr, content)
processData :: PGF -> String -> String
processData gr content = undefined
outputData :: String -> IO ()
outputData contents = writeFile "output.txt" contents
main :: IO ()
main = do
    file:_ <- getArgs
    (gr, content) <- readData file
    outputData $ processData gr content
    putStrLn "bye"
-- Or simply
-- main = do
--     file:_ <- getArgs
--     readData file >>= outputData . processData . uncurry
--     putStrLn "bye"

processData里面你可以做一些类似的事情

processData :: PGF -> String -> String
processData gr content
    = unlines
    $ map (processLine gr)
    $ lines content
    where
        processLine :: PGF -> String -> String
        processLine pgf line = ???

lines 函数会将字符串拆分为行,然后您使用 processLine 处理每个字符串,然后使用 unlines 将其连接回单个字符串以准备输出。

最新更新