我正在尝试编译此函数,但出现错误。 Haskell不满意是什么?
copyFile :: FilePath -> FilePath -> IO()
copyFile fromFile toFile =
do c <- readFile fromFile
writeFile toFile c
函数应用程序中意外的do块: 做c <-readFile fromFile 你可以用括号写 还是您想启用BlockArguments?
答案 0 :(得分:5)
缩进并不完全正确,因此编译器将其解析为好像do
仅应用于c <- readFile fromFile
,而不应用于writeFile
。
copyFile :: FilePath -> FilePath -> IO()
copyFile fromFile toFile = do
c <- readFile fromFile
writeFile toFile c
或更短:
copyFile :: FilePath -> FilePath -> IO()
copyFile fromFile toFile = readFile fromFile >>= writeFile toFile
话虽如此,我强烈建议改用copyFile :: FilePath -> FilePath -> IO ()
或copyFileWithMetadata :: FilePath -> FilePath -> IO ()
。这样,您就不会在内存中加载文件的内容(该文件可能大于可用内存量)。某些文件系统可以显着提高效率,例如,仅对文件添加一个额外的引用,并在两个文件之一被修改的情况下制作真实副本。