#haskell
Вопрос:
Я ищу функцию в стандартной библиотеке с сигнатурой, подобной этой:
Traversable f => f (Either e a) -> Either [e] (f a)
Или, может быть, что-то вроде этого:
(Traversable f, Monoid e) => f (Either e a) -> Either e (f a)
Идея состоит в том, чтобы собирать ошибки вместо сбоя при обнаружении первой ошибки.
Я увидел, что моя функция очень похожа sequence
, и я надеялся, что уже существует класс типов, который моделирует этот шаблон.
Комментарии:
1. хаскелл нуб здесь, что это
=>
значит?2. @NooneAtAll Это отделяет контекст от остального типа. Видишь haskell.org/tutorial/classes.html для получения более подробной информации.
Ответ №1:
Для этого вы можете использовать Validation
тип данных. Из документации:
[A]
Validation
— это либо значение типаerr
, либоa
, аналогичноEither
. ОднакоApplicative
экземпляр forValidation
накапливает ошибки с помощьюSemigroup
параметра вклerr
. В отличие от этого,Applicative
дляEither
возвращает только первую ошибку.
Напр.:
> sequenceA [Failure [1], Success "Test", Failure [2] :: Validation [Int] String]
Failure [1, 2]
Комментарии:
1. Да, это похоже на то, как
Either
Applicative
должно работать, чтобы соответствоватьConst
и отказываться выбрасывать любую информацию (если только тип не говорит об этом). Это старое решение, я надеюсь, что сегодня мы будем знать лучше…2. @luqui проблема в том, что законы монады предписывают, что монада
ap
(p >>= f -> q >>= x -> return (f x)
) должна быть такой же, как<*>
. Но это несовместимо с таким накапливающимся поведением ошибок. ТакValidation
что на самом деле это не является примеромMonad
.