从IO ExitCode monad获取字符串

时间:2011-11-18 20:24:51

标签: haskell io monads ghc

我正在尝试将作为参数给出的字符串(使用getArgs)连接到haskell程序,例如: 位于"rm " ++ filename ++ " filename2.txt"块内的main = do

问题在于文件名的类型,ghc不会编译它,给出错误。

我收到错误Couldn't match expected type [a] against inferred type IO ExitCode

我们尝试运行的代码是:

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

3 个答案:

答案 0 :(得分:7)

您需要$

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

或括号:

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

否则你试图运行它:

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

失败是因为++想要[a](在这种情况下是String),但得到IO ExitCode(来自system)。

答案 1 :(得分:3)

问题是函数应用程序的优先级高于(++)运算符,所以它解析为

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

而你的意思是

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

或只是

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

答案 2 :(得分:-1)

以下代码有效:

import System.Process
import System.Environment

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

其他评论者解释了原因。