我尝试重命名Haskell中的文件列表,并使用以下代码。
let listOfFullPath = ["/home/name/oldFile.txt"]
let outputList = map(\x -> renameFile x "/home/name/newfile.txt") listOfFullPath
当我运行代码时,我没有看到文件被重命名。
有谁知道为什么renameFile
在地图()内部不起作用?
我知道renameFile :: FilePath -> FilePath -> IO ()
,我也尝试过:
let outputList = map(\x -> renameFile x "/home/name/newfile.txt" >> return ()) listOfFullpath
答案 0 :(得分:7)
Haskell被懒惰地评估,所以虽然outputList
的类型(可能;我没有尝试过)[IO ()]
,但没有进一步发生,因为你的代码实际上从未遍历列表。
您可能需要mapM_
代替map
:
module Q45965113 where
import System.Directory
go = do
let listOfFullPath = ["./oldFile.txt"]
mapM_ (\x -> renameFile x "./newfile.txt") listOfFullPath
您可以将其加载到GHCi中并运行go
:
Prelude> :load 45965113.hs
[1 of 1] Compiling Q45965113 ( 45965113.hs, interpreted )
Ok, modules loaded: Q45965113.
*Q45965113> :! ls *.txt
oldfile.txt
*Q45965113> go
*Q45965113> :! ls *.txt
newfile.txt
如您所见,该文件已重命名。