如何使用包含以下详细信息的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
我希望你帮助我解决这个问题。
答案 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
将其连接回一个准备输出的字符串。