Я борюсь с лучшим способом сообщить об ошибках в наборе функций, которые должны хорошо составляться, в библиотеке, над которой я работаю.
Конкретно, у меня есть функции, которые выглядят так:
foo, bar, baz :: a -> Maybe a
, где foo
может потерпеть неудачу только одним способом (подходит для Maybe
), но bar
и baz
могут потерпеть неудачу двумя разными способами (хорошо подходит для Either BarErrors
и Either BazErrors
) ,
Одним из решений является создание:
data AllTheErrors = TheFooError
| BarOutOfBeer
| BarBurnedDown
| ...
и заставить все функции возвращать Either AllTheErrors
, что выражает диапазон ошибок, которые могут быть вызваны последовательностью этих функций, составленной , за счет выражения диапазона возможных ошибок для каждого индивидуальная функция.
Есть ли способ, которым я могу получить оба? Может быть с чем-то кроме монадической композиции? Или с типами семей (машет руками) ...?