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