我正在尝试将作为参数给出的字符串(使用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"
答案 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"
其他评论者解释了原因。