在Haskell中复制文件列表时遇到了一个奇怪的问题。如果我运行以下代码:
copy :: [FilePath] -> FilePath -> IO ()
-- Precondition: dir must be a directory.
copy fs dir = do
isDir <- doesDirectoryExist dir
if (isDir)
then do
mapM_ putStrLn fs -- Poor man's debug.
mapM_ (`copyFile` dir) fs
else ioError (userError $ dir ++ " is not a directory.")
mapM_ putStrLn fs
的输出会提供一个文件,但是第二个mapM_
会失败并显示以下消息:
./.copyFile4363.tmp: copyFile: inappropriate type (Is a directory)
我真的很困惑,因为在mapM_
的两种用法中,列表fs
都作为参数传递。
我忽略了什么吗?
答案 0 :(得分:4)
来自System.Directory Haddock(强调我的):
copyFile :: FilePath -> FilePath -> IO () Source
copyFile old new
将现有文件从旧复制到 new 。如果 new 文件已存在,则会被旧文件原子替换。 两条路径都不能引用现有目录。如果可能,旧的权限将复制到 new 。