Функция, подобная последовательности, которая сообщает обо всех ошибках

#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 экземпляр for Validation накапливает ошибки с помощью 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 .