我尝试重命名Haskell中的文件列表,并使用以下代码.
let listOfFullPath = ["/home/name/oldFile.txt"]
let outputList = map(\x -> renameFile x "/home/name/newfile.txt") listOfFullPath
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我没有看到文件被重命名.
有谁知道为什么renameFile不在map()内部工作?
我知道renameFile :: FilePath -> FilePath -> IO (),我也尝试以下:
let outputList = map(\x -> renameFile x "/home/name/newfile.txt" >> return ()) listOfFullpath
Run Code Online (Sandbox Code Playgroud)
Haskell是懒惰的评估,所以虽然类型outputList是(可能;我还没有尝试)[IO ()],没有进一步发生,因为你的代码永远不会实际遍历列表.
你可能需要mapM_而不是map:
module Q45965113 where
import System.Directory
go = do
let listOfFullPath = ["./oldFile.txt"]
mapM_ (\x -> renameFile x "./newfile.txt") listOfFullPath
Run Code Online (Sandbox Code Playgroud)
您可以将其加载到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
Run Code Online (Sandbox Code Playgroud)
如您所见,该文件已重命名.