重命名Haskell中的文件列表

时间:2017-08-30 16:06:44

标签: haskell

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

1 个答案:

答案 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

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