`mapM_`,`copyFile`和ghost文件

时间:2015-10-22 10:15:06

标签: haskell io monads

在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都作为参数传递。

我忽略了什么吗?

1 个答案:

答案 0 :(得分:4)

来自System.Directory Haddock(强调我的):

copyFile :: FilePath -> FilePath -> IO () Source
     

copyFile old new将现有文件从复制到 new 。如果 new 文件已存在,则会被文件原子替换。 两条路径都不能引用现有目录。如果可能,的权限将复制到 new