getArgs是如何工作的?

4

我正在尝试理解Haskell中的getArgs函数。以下是我的理解:

import System.Environment

myFunFunction = do
     args <- getArgs
     return $ head args

当我运行该函数时,所得到的结果是:
 *Main> myFunFunction
 *** Exception: Prelude.head: empty list

这与getLine不同吗?为什么不要求命令行参数?

1
当调用程序时,可以通过命令行提供参数,例如prog arg1 arg2 ... - Lee
您没有向程序提供任何参数。 - freestyle
如果我这样调用myFunFunction "hello",它应该可以正常工作吗?@freestyle - JamalCrawford..
从文档中,@JamalCrawford,函数getArgs返回程序命令行参数的列表(不包括程序名称)。 - freestyle
我能读文档,但显然我有些不理解。这就是为什么我在这里询问的原因。 - JamalCrawford..
使用 withArgs ["test"] myFunFunction - 4castle
1个回答

7
getArgs 的类型是 IO [String]。 在 OP 中使用 <- 绑定它时,绑定的符号(args)的类型为 [String],即字符串列表。 head 函数返回列表中的第一个元素; 它的类型是 [a] -> a。它因不安全而臭名昭著,如果将其应用于空列表,则会崩溃:
Prelude System.Environment> head []
*** Exception: Prelude.head: empty list

这里发生的事情是这样的。当你运行程序时,在命令行中提供的参数将由getArgs函数返回。如果你在命令行中没有提供任何参数,则返回的列表将为空。 getArgs函数不是交互式的。它只会返回从命令行提供的参数,如果有的话。

14
可能也会感兴趣的是:在ghci中测试时,仅运行main不会以任何特殊方式设置参数列表,但是:main foo bar baz会这样做。 - Daniel Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接