2017-08-30 54 views
1

我尝试重命名Haskell中的文件列表,并使用以下代码。重命名Haskell中的文件列表

let listOfFullPath = ["/home/name/oldFile.txt"] 
let outputList = map(\x -> renameFile x "/home/name/newfile.txt") listOfFullPath 

当我运行代码时,我没有看到文件被重命名。

有谁知道renameFile为什么不能在map()中工作吗?

我知道renameFile :: FilePath -> FilePath -> IO()和我也尝试以下操作:

let outputList = map(\x -> renameFile x "/home/name/newfile.txt" >> return()) listOfFullpath 
+0

您是在GHCi中运行它还是正在编译的文件的这一部分?无论哪种情况,您都没有执行“IO”动作。充其量,你正在定义其中的一部分。 – Alec

+0

'let x = print 3'不会打印任何东西:它只定义'x',在执行时会打印3.要执行'x',必须在'main'或其他一些被调用的IO动作内运行(不只是定义)从'main'。同样,'let xs = [print 3,print 4]'不会打印任何东西。主要的是,如果我们运行'print(length xs)',我们得到2(长度),而IO操作'print 3,print 4'仍然被忽略。如果我们使用'main = sequence xs',则打印3和4。 (我会建议查看一个IO教程。) – chi

+0

我确实拥有并运行它。 – 1234

回答

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 

正如你可以看到,该文件已被重命名。

+0

你应该尝试一下,它不会工作。我也尝试mapM_ – 1234

+0

我完全没有错误。 – 1234

+0

我可以运行renameFile(oldName newName),并且我没有问题重命名文件。 – 1234