如何使用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
将其连接回单个字符串以准备输出。