我是 Haskell 新手,我正在尝试解决这个问题。给定两个文件,一个输入文件和一个输出文件,我想从输入文件中读取,删除重复的行,然后将(唯一的行)写入输出文件。我设法读取文件并删除重复项,但现在我在写入文件时遇到问题。
这是我到目前为止的思考过程:
onlyUnique :: FilePath -> FilePath -> IO ()
onlyUnique inputFile outputFile = do
-- read input file
-- remove duplicated lines in file
-- writes remaining lines into outputFile
contents <- readFile inputFile
let noDups = nub (words contents)
fileNoDups <- foldr (\x acc -> (writeFile acc x)) outputFile noDups
此解决方案的问题是 writeFile 是错误的类型,但我不知道如何在不使用foldr的情况下遍历字符串列表以写入文件。递归?但在这种情况下我该怎么做。
或
onlyUnique :: FilePath -> FilePath -> IO ()
onlyUnique inputFile outputFile = do
-- read input file
-- remove duplicated lines in file
-- writes remaining lines into outputFile
contents <- readFile inputFile
let noDups = nub (words contents)
when (length noDups > 0) $
writeFile outputFile (noDups)
也许我可以创建一个辅助函数?但那看起来怎么样,我只是很困惑。
您在问题中说您想删除重复的行,但在您的程序中,看起来您正在尝试删除重复的单词。
否则,您就走在正确的道路上。假设您对 lines 感兴趣,那么您可以使用函数 lines
(将
String
分解为行列表)和 unlines
(将行列表重新粘合到单个字符串中)的 pair来执行您想要的操作。
onlyUnique :: FilePath -> FilePath -> IO ()
onlyUnique inputFile outputFile = do
-- read input file
contents <- readFile inputFile
-- remove duplicated lines in file
let noDups = nub (lines contents)
-- put lines back together
let output = unlines noDups
-- write the result to output file
writeFile outputFile output