如何部分解析产品类型

时间:2019-02-03 17:44:44

标签: haskell optparse-applicative

data Config = Config {
    a :: Bool,
    b :: Type1,
    c :: Type2
}

pA :: Parser Bool

pB :: Parser Type1

pC :: Parser Type2

pConfig :: Parser Config
pConfig = Config <$> pA <*> pB <*> pC

opts :: ParserInfo Config
opts = info (pConfig <**> helper)
       (fullDesc <> progDesc "My CLI" <> header "CLI executable")

main :: IO()
main = do
       (Config a b c) <- execParser opts
-- Populate a default config using a b c values

是否可以部分解析产品类型? Config是具有成员a,b和c的产品类型,并假定它来自库,因此我无法重新定义它。我只想解析a和b而不关心c。但是,由于“解析器配置”只能具有以下结构

Config <$> pA <*> pB <*> pC

由于是产品类型,如果我不提供“ pC”,则会出现错误。如何正确处理这种情况?

1 个答案:

答案 0 :(得分:3)

Config <$> pA <*> pB <*> pC符号并不关心Config是构造函数;您可能已经使用了Bool -> Type1 -> Type2 -> Config类型的任何函数。如果您不想解析Type2,则可以使用Bool -> Type1 -> Config类型的任何函数。

config' :: Bool -> Type1 -> Config
config' a b c = Config a b someDefaultType2

pConfig :: Parser Config
pConfig = config' <$> pA <*> pB

等效地,您坚持使用Config构造函数,但将pure值而不是解析器连接到其第三个参数。

pConfig :: Parser Config
pConfig = Config <$> pA <*> pB <*> pure someDefaultType2

(无论哪种方式,如果您想获取Type2,则都需要采用某种的方式来提供值Config。)