【问题标题】:Input arguments using getArgs returns nothing使用 getArgs 的输入参数不返回任何内容
【发布时间】:2018-03-06 17:37:26
【问题描述】:

我正在尝试理解 getArgs,但我遇到了一种我不理解的奇怪行为。这是我的程序:

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

我运行它并得到:

*Main> hello <- getMyArgs
*Main> 

为什么它不返回我通过的参数?我试图放入一个“ show() ”,但这会将它变成一个 String 而不是 [String]

【问题讨论】:

  • 您显示的代码不应该终止 - 这是一个无限循环。您如何展示您的实际代码以及您如何尝试运行它。
  • 这是我的代码
  • 啊抱歉。我明白你在说什么
  • 这更有意义。您已将hello 绑定到getMyArgs 的结果,所以现在您只需编写helloprint hello 即可查看其值。
  • @WillemVanOnsem 好吧,现在它已经被编辑过了,是的。

标签: haskell io arguments


【解决方案1】:
getMyArgs :: IO [String]
getMyArgs =do
         x <- getArgs
         return x

do 表示法不适合:

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 的观察。

【讨论】:

  • 出于某种原因,我认为“hello
  • 不,hello 是一个变量名,其中包含作为字符串值列表的参数。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2017-07-15
    • 2013-12-24
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多