【发布时间】:2012-01-04 03:16:16
【问题描述】:
我有一些需要验证的嵌套记录,我想知道 Haskell 的惯用方法是什么。
为了简化:
data Record = Record {
recordItemsA :: [ItemA],
recordItemB :: ItemB
} deriving (Show)
data ItemA {
itemAItemsC :: [ItemC]
} deriving (Show)
要求是:
- 收集并返回所有验证错误
- 某些验证可能跨项目,例如
ItemsA反对ItemB -
Strings 足以表示错误
我目前的代码感觉很尴尬:
type ErrorMsg = String
validate :: Record -> [ErrorMsg]
validate record =
recordValidations ++ itemAValidations ++ itemBValidations
where
recordValidations :: [ErrorMsg]
recordValidations = ensure (...) $
"Invalid combination: " ++ (show $ recordItemsA record) ++ " and " ++ (show $ recordItemsB record)
itemAValidations :: [ErrorMsg]
itemAValidations = concat $ map validateItemA $ recordItemsA record
validateItemA :: ItemA -> [ErrorMsg]
validateItemA itemA = ensure (...) $
"Invalid itemA: " ++ (show itemA)
itemBValidations :: [ErrorMsg]
itemBValidations = validateItemB $ recordItemB record
validateItemB :: ItemB -> [ErroMsg]
validateItemB itemB = ensure (...) $
"Invalid itemB: " ++ (show itemB)
ensure :: Bool -> ErrorMsg -> [ErrorMsg]
ensure b msg = if b then [] else [msg]
【问题讨论】:
-
感谢您的建议,看起来很有趣。同一个项目使用 uu-parsinglib 进行解析,因此应用样式验证非常适合。
-
这里的菜鸟问题:什么是 (...) 符号?
-
(...) 只是省略了无聊的部分,而不是一些花哨的运算符。
-
@MauricioScheffer 该链接不再有效 :( 编辑:我找到了,这是你的意思吗?hackage.haskell.org/package/Validation
标签: haskell