Haskell中支持共享参数的命令行参数解析

Haskell中支持共享参数的命令行参数解析,haskell,command-line,Haskell,Command Line,我们目前正在使用System.Console.CmdArgs解析命令行参数。然而,我们对目前的做法并不完全满意。子命令之间有许多共享选项——例如用户名、开始日期和结束日期等 是否有支持“继承”的Haskell命令行解析库,或者可以获取子命令项函数列表并自动派生解析器?我们的目标是避免锅炉板,我们现在有很多 我们的子命令的一些示例: sum-payments [--start] [--end] [user] list-users-seen [--start] [--end] sum-queries

我们目前正在使用
System.Console.CmdArgs
解析命令行参数。然而,我们对目前的做法并不完全满意。子命令之间有许多共享选项——例如用户名、开始日期和结束日期等

是否有支持“继承”的Haskell命令行解析库,或者可以获取子命令项函数列表并自动派生解析器?我们的目标是避免锅炉板,我们现在有很多

我们的子命令的一些示例:

sum-payments [--start] [--end] [user]
list-users-seen [--start] [--end]
sum-queries [--start] [--end]

所有子命令都支持
start
end
选项,默认值始终为“开始时间”和“到现在”。每个子命令都可能有自己的选项或位置参数。

下面是一个简单的示例,说明如何使用
optpass applicative

注意
startEnd
解析器是如何在
listUsers
解析器中使用的。
startEnd
解析器可用于任何其他需要开始和结束选项的解析器

import Options.Applicative

data StartEnd = StartEnd String String
  deriving (Show)

data ListUsers = ListUsers { user :: String, bounds :: StartEnd }
  deriving (Show)

startEnd :: Parser StartEnd
startEnd = StartEnd
  <$> strOption ( long "start" )
  <*> strOption ( long "end" )

listUsers :: Parser ListUsers
listUsers = ListUsers <$> strOption ( long "user") <*> startEnd

doListUsers :: ListUsers -> IO ()
doListUsers lusers = print lusers

main :: IO ()
main = execParser opts >>= doListUsers
  where
    opts = info (helper <*> listUsers)
      ( fullDesc
     <> progDesc "Print a greeting for TARGET"
     <> header "hello - a test for optparse-applicative" )
导入选项。应用程序
数据StartEnd=StartEnd字符串
派生(显示)
数据ListUsers=ListUsers{user::String,bounds::StartEnd}
派生(显示)
startEnd::解析器startEnd
startEnd=startEnd
选择(长“开始”)
选择(长“结束”)
listUsers::解析器listUsers
listUsers=listUsers选项(长“用户”)startEnd
doListUsers::ListUsers->IO()
doListUsers lusers=打印lusers
main::IO()
main=execParser opts>>=doListUsers
哪里
opts=info(帮助列表用户)
(全文)
progDesc“为目标打印问候语”
标题“hello-optparse应用程序的测试”)

下面是一个简单的示例,说明如何使用
optpass应用程序

注意
startEnd
解析器是如何在
listUsers
解析器中使用的。
startEnd
解析器可用于任何其他需要开始和结束选项的解析器

import Options.Applicative

data StartEnd = StartEnd String String
  deriving (Show)

data ListUsers = ListUsers { user :: String, bounds :: StartEnd }
  deriving (Show)

startEnd :: Parser StartEnd
startEnd = StartEnd
  <$> strOption ( long "start" )
  <*> strOption ( long "end" )

listUsers :: Parser ListUsers
listUsers = ListUsers <$> strOption ( long "user") <*> startEnd

doListUsers :: ListUsers -> IO ()
doListUsers lusers = print lusers

main :: IO ()
main = execParser opts >>= doListUsers
  where
    opts = info (helper <*> listUsers)
      ( fullDesc
     <> progDesc "Print a greeting for TARGET"
     <> header "hello - a test for optparse-applicative" )
导入选项。应用程序
数据StartEnd=StartEnd字符串
派生(显示)
数据ListUsers=ListUsers{user::String,bounds::StartEnd}
派生(显示)
startEnd::解析器startEnd
startEnd=startEnd
选择(长“开始”)
选择(长“结束”)
listUsers::解析器listUsers
listUsers=listUsers选项(长“用户”)startEnd
doListUsers::ListUsers->IO()
doListUsers lusers=打印lusers
main::IO()
main=execParser opts>>=doListUsers
哪里
opts=info(帮助列表用户)
(全文)
progDesc“为目标打印问候语”
标题“hello-optparse应用程序的测试”)

下面是一个示例,说明您试图解析的命令可能会很有用。因此,这里不是请求库建议的地方……因此,您可以描述问题、当前解决方案和面临的困难,如果这是一个合适的解决方案,有人可以建议使用不同的库。这里有一个说明性的示例,说明您试图解析的命令。因此,这里不是请求库建议的地方……因此,您可以描述问题、您当前的解决方案和您面临的障碍,如果这是一个合适的解决方案,有人可以建议使用不同的库。