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