История изменений
Исправление hateyoufeel, (текущая версия) :
Не очень понимаю, как тебе в таком варианте Applicative поможет. Но всё же. Вот тебе примерный кусок:
type Errors = [String]
whenNothing :: Monad m => Maybe a -> m b -> m b
whenNothing Nothing f = f
whenNothing _ _ = return ()
validateInput :: InputData -> Either Errors OutputData
validateInput InputData{..} =
case runWriter f of
(Just v, []) -> Right v
(_, errs) -> Left errs
where
f = do
let v1 = readMaybe input1
whenNothing v1 $
tell "Failed to parse input1"
let v2 = readMaybe input2
whenNothing v2 $
tell "Failed to parse input2"
...
return (OutputData <$> v1 <*> v2 ...)
Я такое довольно часто вижу, только вместо Maybe там другой комбинатор с конкретными ошибками и т.д.
Исходная версия hateyoufeel, :
Не очень понимаю, как тебе в таком варианте Applicative поможет. Но всё же. Вот тебе примерный кусок:
type Errors = [String]
validateInput :: InputData -> Either Errors OutputData
validateInput InputData{..} =
case runWriter f of
(Just v, []) -> Right v
(_, errs) -> Left errs
where
f = do
let v1 = readMaybe input1
whenNothing v1 $
tell "Failed to parse input1"
let v2 = readMaybe input2
whenNothing v2 $
tell "Failed to parse input2"
...
return (OutputData <$> v1 <*> v2 ...)
Я такое довольно часто вижу, только вместо Maybe там другой комбинатор с конкретными ошибками и т.д.