2017-08-30 82 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