haskell - 如何部分解析产品类型
问题描述
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”,它就会出错。如何正确处理这种情况?
解决方案
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
(无论哪种方式,如果您想退出,您确实需要某种方式来提供 的值。)Type2
Config
推荐阅读
- java - Spring Boot 基本应用程序:字段 NotesRepository 需要找不到类型为“com.demo.NotesRepository”的 bean
- mysql - 如何向用户添加所有 SHOW 权限?
- javascript - 如何在 React App 中的页面加载时不调用所有组件
- oauth-2.0 - Spring boot OAuth2在尝试使用访问令牌获取资源时获得访问被拒绝异常
- angular - mat-pagination 和 sort 在 ngx-bootstrap 模式下不起作用
- python - 将集合转换为列表时,是什么决定了项目顺序?
- python - 如何删除“
“来自 json 响应” “? - java - 如何从回历日期转换为格鲁吉亚日期,反之亦然
- firebase - 使用 Firebase 身份验证和 Rest Api 让用户永久登录 Flutter
- c# - 在 API MVC 中删除列/调整模型