使用getArgs的输入参数不返回任何内容

时间:2018-03-06 17:37:26

标签: haskell io arguments

我正在尝试理解getArgs,但我得到一个奇怪的行为,我不理解。这是我的计划:

getMyArgs :: IO [String]
getMyArgs =do
         x <- getArgs
         return x

我跑了这个并得到:

*Main> hello <- getMyArgs
*Main> 

为什么它没有通过我的论点?我试图加入一个&#34; show()&#34;但是把它变成了一个String而不是一个[String]

2 个答案:

答案 0 :(得分:2)

getMyArgs :: IO [String]
getMyArgs =do
         x <- getArgs
         return x

符号说到:

getMyArgs :: IO [String]
getMyArgs =  getArgs >>= \x -> return x

使用正确的身份我们可以将其重写为:

getMyArgs :: IO [String]
getMyArgs =  getArgs

所以你刚刚为getArgs定义了一个新名称。现在为什么getArgs不显示你的程序参数?好吧,看来你没有提供任何程序参数。在解释器中提供参数可能很棘手 - 一种方法是:set它们:

Prelude> :set args hello world
Prelude> import System.Environment
Prelude System.Environment> getArgs
["hello","world"]
编辑:哦,你可能想要打印你绑定的价值。考虑:

Prelude System.Environment> hello <- getArgs
Prelude System.Environment> print hello
["hello","world"]

感谢@ 4castle的观察。

答案 1 :(得分:1)

假设您的Haskell程序已编译为可执行文件foo。当您调用程序时,您希望将一些运行时参数传递给您的程序,例如foo param1 param2。根据 param1 param2 的值,您将在程序中执行不同的操作。

现在使用 getArgs 函数,您可以在Haskell程序中访问这些参数。

在GHCi中,可以模拟这种参数传递。使用:set args paarm1 param2命令,如Thomas M. DuBuisson的答案所示 或者您使用:main param1 param2在GHCI中调用您的主程序。

在两种情况下, getEnv 都会返回IO ["param1", "param2"]