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