如何部分解析产品类型
How to parse a product type partially
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。但是,由于 "Parser Config" 只能有如下结构
Config <$> pA <*> pB <*> pC
由于是产品类型,如果我不给出 "pC" 就会出错。如何正确处理这种情况?
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
(无论哪种方式,如果你想得到一个 Config
,你确实需要有 一些 方法来提供 Type2
的值。 )
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。但是,由于 "Parser Config" 只能有如下结构
Config <$> pA <*> pB <*> pC
由于是产品类型,如果我不给出 "pC" 就会出错。如何正确处理这种情况?
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
(无论哪种方式,如果你想得到一个 Config
,你确实需要有 一些 方法来提供 Type2
的值。 )