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

时间:2014-12-29 16:55:48

标签: 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 我希望你帮助我解决这个问题。

1 个答案:

答案 0 :(得分:4)

我建议将输入,处理和输出分成单独的函数。特别是,这样做的好处是,所有数据处理都是纯粹的,而不是混合处理和文件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将其连接回一个准备输出的字符串。