使用getArgs时“用户错误”模式匹配失败

时间:2014-02-26 20:34:56

标签: haskell

import Control.Concurrent (forkIO)
import System.Environment (getArgs)

main= do
    [a,b]<- getArgs
    putStrLn $ "command line arguments: " ++ show [a,b]

当我编辑它时,它没事,但是当我运行它时,
它说“用户错误(模式匹配失败在do表达式中)”,这里有什么问题?

2 个答案:

答案 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被抛出。