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