【问题标题】:Getting a string from a IO ExitCode monad从 IO ExitCode monad 获取字符串
【发布时间】:2011-11-18 20:24:51
【问题描述】:

我正在尝试将作为参数给出的字符串(使用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"

【问题讨论】:

  • 谢谢,我编辑了问题...

标签: haskell io monads ghc


【解决方案1】:

你需要$:

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

或括号:

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

否则你会尝试运行这个:

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

失败是因为++ 想要[a](在本例中为String)但得到IO ExitCode(来自system)。

【讨论】:

    【解决方案2】:

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

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

    而你的意思是

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

    或者干脆

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

    【讨论】:

      【解决方案3】:

      以下代码有效:

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

      其他评论者解释了原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 2011-10-01
        • 2012-12-20
        • 1970-01-01
        相关资源
        最近更新 更多