LINUX.ORG.RU

История изменений

Исправление 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 там другой комбинатор с конкретными ошибками и т.д.