我正在尝试理解getArgs,但我得到一个奇怪的行为,我不理解。这是我的计划:
getMyArgs :: IO [String]
getMyArgs =do
x <- getArgs
return x
我跑了这个并得到:
*Main> hello <- getMyArgs
*Main>
为什么它没有通过我的论点?我试图加入一个&#34; show()&#34;但是把它变成了一个String而不是一个[String]
答案 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"]