Mam kilka zagnieżdżonych rekordów, które muszę sprawdzić, i zastanawiam się, co jest idiotyczną metodą Haskell, aby to zrobić.Validations in Haskell
Upraszczając:
data Record = Record {
recordItemsA :: [ItemA],
recordItemB :: ItemB
} deriving (Show)
data ItemA {
itemAItemsC :: [ItemC]
} deriving (Show)
Wymagania są następujące:
- zbierać i zwrócić wszystkie błędy sprawdzania poprawności
- Niektóre walidacji może być po drugiej pozycji, na przykład
ItemsA
przeciwkoItemB
String
s są wystarczające do reprezentowania błędy
Obecnie mam kod, który czuje się niezręcznie:
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]
czy rozważasz https://bitbucket.org/dibblego/validation? –
Dzięki za sugestię, wygląda bardzo interesująco. Ten sam projekt używa uu-parsinglib do analizowania, więc sprawdzanie stylu aplikacji byłoby dobrym rozwiązaniem. –
Noob pytanie tutaj: co to jest (...) zapis? – Simon