首页 > 解决方案 > 如何部分解析产品类型

问题描述

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”,它就会出错。如何正确处理这种情况?

标签: haskelloptparse-applicative

解决方案


Config <$> pA <*> pB <*> pC符号不在乎它是Config构造函数;你可以使用任何类型的函数Bool -> Type1 -> Type2 -> Config。如果您不想解析 a 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

(无论哪种方式,如果您想退出,您确实需要某种方式来提供 的值。)Type2Config


推荐阅读