2014-12-29 88 views
2

各行如何寫代碼包含以下細節的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

'循環(gr內容)'應該是'循環gr內容'。函數應用程序不需要括號,在這裏它實際上會導致類型錯誤,因爲它使得它看起來像是將參數'content'應用於函數'gr',這顯然是不正確的。 – bheklilr

+0

我希望將內容作爲參數傳遞給循環,並且我只是要將內容分隔到行中,然後在每行上應用翻譯功能。你是對的,我必須省略括號。 – mohammad

回答

3

我會建議將我們的輸入,處理和輸出分成不同的功能。特別是,這給人的優點是你所有的數據處理是純粹的,而不是混合處理和文件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將其加回到一個字符串中以準備輸出。