2016-05-25 57 views
2

這裏是一個域特定的文件IO功能我寫的摘錄:如何在Haskell中構造一個no-op IO()表達式?

let 
    cp :: FilePath -> IO() 
    cp "." = putStr "" -- OUCH! 
    cp ".." = putStr "" -- CRIKEY! 
    cp fname = custom logic here... 
in mapM_ cp filepaths 

我明白mapM_讓我們丟棄/忽略所有IO()的結果,所以我想putStr ""的清潔替代 - - 即。 Haskell的「規範」方式來編寫「一個類型正確的無操作IO(或monad)表達式,什麼也不做」。

從我的新手閱讀中,我腦子裏想的undefined,雖然這編譯並不會造成問題,它提供了一個不必要的標準輸出打印main.hs: Prelude.undefined(我用stack runghc main.hs這裏的唯一編碼環境---它只是足夠此,,但是上面的代碼將通過目錄樹遞歸循環:所以這將是重新學習更好或更「合適」方式的好時機。

+7

嘗試「cp」。「 = return()' – hao

+1

@haoformayor:那應該是個答案:-) –

回答

6

這是Haskell的學習曲線的一個不幸的方面:你會覺得應該有某種叫做

doNothing :: IO() 

供您使用庫函數,但生態系統期望你要知道在return功能Monad typeclass,它是許多類型類型中的一個,它們是IO實例。在這種情況下,return()應該產生創建IO動作(讀取:效果,或thunk或承諾)的預期行爲,該動作什麼也不做。

您可能也有興趣listDir and copyFile from the path-io package,通過使用強類型比type FilePath = String能夠與...共整個問題做掉。特別注意listDir如何分別在一個元組中返回子目錄和文件。如果這不符合Haskell的精神,那麼是什麼?它確實帶來了外部依賴,但我一直在尋找情況來插入這個優秀的庫。

+0

感謝您的詳細解釋,及時的'return'提醒和建議! (對於這樣的一次性,我想在任何一臺只有香草堆的機器上配置零配置,零依賴性和即時運行能力,但對於其他工作路徑,io聽起來非常出色。) – metaleap

相關問題