我想读取一个文件,删除重复的行并将(唯一的行)写入另一个文件

问题描述 投票:0回答:1

我是 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)

也许我可以创建一个辅助函数?但那看起来怎么样,我只是很困惑。

haskell recursion monads
1个回答
0
投票

您在问题中说您想删除重复的,但在您的程序中,看起来您正在尝试删除重复的单词。

否则,您就走在正确的道路上。假设您对 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
© www.soinside.com 2019 - 2024. All rights reserved.