cmdargs值没有等号的参数

时间:2014-02-24 23:53:47

标签: haskell command-line-arguments haskell-cmdargs

我使用cmdargs为我的Haskell程序编写CLI解析器。

我们假设这个程序直接来自他们的例子:

{-# LANGUAGE DeriveDataTypeable #-}
import System.Console.CmdArgs.Implicit

data Sample = Sample {hello :: String} deriving (Show, Data, Typeable)

sample = Sample{hello = def &= help "World argument" &= opt "world"}
         &= summary "Sample v1"

main = print =<< cmdArgs sample

如果这个程序被调用cmdtest.hs,我可以执行

$ runghc cmdtest.hs --hello=world
Sample {hello = "world"}

但是,如果我不使用等号(例如-o中的gcc -o foo foobar.c选项),cmdargs会尝试将world识别为位置参数

$ runghc cmdtest.hs --hello world
Unhandled argument, none expected: world

我是否可以设置任何选项/注释以在cmdargs中使用此语法?

更新:使用短选项会遇到同样的问题:

$ runghc cmdtest.hs -h world
Unhandled argument, none expected: world

更新2 :cmdargs data模块中的FlagInfo Explicit似乎暗示它在某种程度上可行,至少在使用Explicit时而不是Implicit

1 个答案:

答案 0 :(得分:2)

您的问题是,您正在使用opt,这使--hello的值可选。因此,--hello world表示--hello没有值,后跟world作为位置参数。这当然是cmdargs中的设计选择,但我认为它是合理的,它与大多数其他程序的行为相匹配。取出opt,看看它是否按您想要的方式工作。