mb1*_*b14 22 haskell command-line-arguments applicative optparse-applicative
我正在尝试使用optparse-applicative来解析一个Maybe String但我找不到任何地方如何处理Maybe.我发现的唯一的事情是添加一个默认值,但我真的需要一个Nothingif用户没有提供选项而不是"".有没有办法实现这个目标?
以下是工作代码的示例:
import Options.Applicative
data Config = Config
{ cIn :: String
, cOut :: String
} deriving Show
configParser :: Parser Config
configParser = Config
<$> strOption (long "in" <> short 'i')
<*> strOption (long "out" <> short 'o')
main :: IO ()
main = do
conf <- execParser (info configParser fullDesc)
print conf
Run Code Online (Sandbox Code Playgroud)
但是,我希望参数是可选的,Maybe String而不是String在Config:
data Config = Config
{ cIn :: Maybe String
, cOut :: Maybe String
} deriving Show
Run Code Online (Sandbox Code Playgroud)
jub*_*0bs 28
请参阅optparse-applicative自述文件的以下段落:
解析器都是实例
Applicative和Alternative,并与任何普通组合子的工作,比如many和some.例如,要使选项返回Nothing而不是在未提供时失败,可以optional在Control.Applicative以下位置使用组合器:Run Code Online (Sandbox Code Playgroud)optional $ strOption ( long "output" <> metavar "DIRECTORY" )
因此,您所要做的就是将optional组合子应用于以下结果strOption:
import Options.Applicative
data Config = Config
{ cIn :: Maybe String
, cOut :: Maybe String
} deriving Show
configParser :: Parser Config
configParser = Config
<$> (optional $ strOption $ long "in" <> short 'i')
<*> (optional $ strOption $ long "out" <> short 'o')
main :: IO ()
main = do
conf <- execParser (info configParser fullDesc)
print conf
Run Code Online (Sandbox Code Playgroud)
在命令行进行测试:
$ main --in foo -o bar
Config {cIn = Just "foo", cOut = Just "bar"}
$ main -i foo
Config {cIn = Just "foo", cOut = Nothing}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1842 次 |
| 最近记录: |