【发布时间】:2019-07-24 01:27:01
【问题描述】:
我正在尝试构建一个 CLI 食品日记应用程序。
这是我希望解析用户输入的数据类型。
data JournalCommand =
JournalSearch Query DataTypes Ingridents BrandOwnder PageNumber
| JournalReport Query DataTypes Ingridents BrandOwnder PageNumber ResultNumber
| JournalDisplay FromDate ToDate ResultNumber
| JournalStoreSearch Query DataTypes Ingridents BrandOwnder PageNumber ResultNumber StoreFlag
| JournalStoreCustom CustomEntry OnDate StoreFlag
| JournalDelete FromDate ToDate ResultNumber
| JournalEdit CustomEntry ResultNumber
deriving (Show, Eq)
因为有很多重叠,我总共有 8 个函数,Parser a 类型。
类似的功能
-- | Search Query
aQueryParser :: Parser String
aQueryParser = strOption
( long "search"
<> short 's'
<> help "Search for a term in the database"
)
如果最终有这样的功能的想法
runJournal :: JournalCommand -> MT SomeError IO ()
runJournal = \case
JournalSearch q d i b p
-> runSearch q d i b p
JournalReport q d i b p r
-> runSearchAndReport q d i b p r
...
...
其中MT 是一些可以处理error + IO 的monad 转换器。还不确定。
问题是:如何设置parseArgs 函数
parseArgs :: IO JournalCommand
parseArgs = execParser ...
和parser函数
parser :: Parser JournalCommand
parser = ...
这样我就可以将用户输入解析为JournalCommand,然后将数据返回给相关函数。
我知道我可以fmap 这样的数据类型
data JournalDisplay { jdFromDate :: UTCTime
, jdToDate :: UTCTime
, jdResultNumber :: Maybe Int
}
作为
JournalDisplay
<$>
fromDateParser
<*>
toDateParser
<*>
optional resultNumberParser
但我不确定如何使用我的原始数据结构来做到这一点。
我想我需要一个像[Mod CommandFields JournalCommand] 这样的列表,我可以通过连接Mod 列表将其传递给subparser 函数。我不完全确定。
【问题讨论】:
标签: haskell optparse-applicative