import Control.Concurrent (forkIO)
import System.Environment (getArgs)
main= do
[a,b]<- getArgs
putStrLn $ "command line arguments: " ++ show [a,b]
当我编辑它时,它没事,但是当我运行它时,
它说“用户错误(模式匹配失败在do表达式中)”,这里有什么问题?
答案 0 :(得分:7)
问题是您在[a, b]
的返回值上匹配getArgs
模式。如果使用2个参数以外的任何其他程序运行程序,则返回值将与模式[a, b]
不匹配。因此,除非您以
$ ./xie 1 2
command line arguments: ["1","2"]
会抛出错误。相反,如果你编写了代码
main = do
args <- getArgs
case args of
[a, b] -> putStrLn $ "command line arguments: " ++ show [a, b]
_ -> putStrLn "Invalid number of arguments"
然后你就不会在模式匹配上失败。
答案 1 :(得分:4)
模式[a,b]
仅匹配2元素列表,因此如果getArgs
返回具有不同元素数量的列表,则匹配将失败。
使用do
表示法时,如果匹配失败,则会调用fail
函数,在IO
的情况下会导致userError
被抛出。