重命名Haskell中的文件列表

123*_*234 1 haskell

我尝试重命名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)

Mar*_*ann 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
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)

如您所见,该文件已重命名.