如何比较Haskell中的两个文件

And*_*Pos 3 haskell functional-programming

我正在学习Haskell,我需要比较两个文件.我没有找到这样做的函数,所以我自己编写了它.以下是我提出的功能.

cmpFiles :: FilePath -> FilePath -> IO Bool
cmpFiles a b = withBinaryFile a ReadMode $ \ha ->
               withBinaryFile b ReadMode $ \hb ->
                 fix (\loop -> do
                   isEofA <- hIsEOF ha
                   isEofB <- hIsEOF hb

                   if | isEofA && isEofB -> return True             -- both files reached EOF
                      | isEofA || isEofB -> return False            -- only one reached EOF
                      | otherwise        -> do                      -- read content
                                              x <- hGet ha 4028     -- TODO: How to use a constant?
                                              y <- hGet hb 4028     -- TODO: How to use a constant?
                                              if x /= y
                                                then return False   -- different content
                                                else loop           -- same content, contunue...
                 )
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这段代码是惯用的吗?它看起来非常重要而不是功能性.
  2. 这个代码是否有效(Layz IO问题大文件,性能......)?
  3. 是否有更紧凑的方式来编写它?

Rei*_*ton 6

怎么样

cmpFiles a b = do
    aContents <- readFile a
    bContents <- readFile b
    return (aContents == bContents)
Run Code Online (Sandbox Code Playgroud)

  • 您可能想要指定这应该是“Data.ByteString.Lazy”中的“readFile”......两者都可以工作,但通常的一个可能会阻塞大文件的内存。“String”版本可能会被二进制数据混淆。 (2认同)
  • 你如何看待这种双桅帆船的颜色?```cmpFiles = liftA2(==)`on`readFile``` (2认同)