Ho alcuni record nidificati che devo convalidare, e mi chiedo quale sia un modo idiomatico di Haskell per farlo.Convalida in Haskell
Per semplificare:
data Record = Record {
recordItemsA :: [ItemA],
recordItemB :: ItemB
} deriving (Show)
data ItemA {
itemAItemsC :: [ItemC]
} deriving (Show)
I requisiti sono:
- raccogliere e restituire tutti gli errori di convalida
- Alcune convalide possono essere tra gli elementi, ad esempio
ItemsA
controItemB
String
s sono sufficienti a rappresentare errori
Al momento ho il codice che si sente a disagio:
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]
hai considerato https://bitbucket.org/dibblego/validation? –
Grazie per un suggerimento, sembra molto interessante. Lo stesso progetto usa uu-parsinglib per l'analisi, quindi la convalida dello stile applicativo sarebbe una buona idea. –
domanda noob qui: qual è la (...) notazione? – Simon