2011-11-18 80 views
2

我試圖將作爲參數給出的字符串(使用getArgs)連接到haskell程序,例如: "rm " ++ filename ++ " filename2.txt"它位於main = do塊內。從IO ExitCode monad獲取字符串

問題在於文件名類型,ghc不會編譯它,給出錯誤。

我得到一個錯誤Couldn't match expected type [a] against inferred type IO ExitCode

我們試圖運行的代碼是:

args <- getArgs 
let inputfname = head args 
system "rm -f "++ inputfname ++ " functions.txt" 
+0

謝謝,我編輯了這個問題... – meltuhamy

回答

7

您需要$

system $ "rm -f "++ inputfname ++ " functions.txt" 

或小括號:

system ("rm -f " ++ inputfname ++ " functions.txt") 

否則你試圖運行這個命令:

(system "rm -f ") ++ inputfname ++ " functions.txt" 

它失敗,因爲++希望[a](在這種情況下String),但得到IO ExitCode(從system)。

+0

謝謝。很棒。 – meltuhamy

3

的問題是功能應用比(++)運營商更高的優先級,所以它解析爲

(system "rm -f ") ++ inputfname ++ " functions.txt" 

,同時你的意思是

system ("rm -f " ++ inputfname ++ " functions.txt") 

或者乾脆

system $ "rm -f " ++ inputfname ++ " functions.txt" 
-1

以下代碼有效:

import System.Process 
import System.Environment 

main = do 
    args <- getArgs 
    let inputfname = head args 
    system $ "rm -f "++ inputfname ++ " functions.txt" 

原因由其他評論者解釋。