【问题标题】: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"
其他评论者解释了原因。