Выразительные и комбинируемые типы ошибок

Я пытаюсь найти лучший способ сообщить об ошибках в наборе функций, которые должны хорошо скомпоноваться, в библиотеке I ' м работаю.

Конкретно у меня есть функции, которые выглядят так:

foo, bar, baz :: a -> Maybe a

где foo может дать сбой только одним способом (хорошо подходит для Может быть ), но bar ] и baz могут давать сбой двумя разными способами каждый (хорошо подходит для Either BarErrors и Either BazErrors ).

Одно из решений - создать:

data AllTheErrors = TheFooError
                  | BarOutOfBeer
                  | BarBurnedDown
                  | ...

и заставить все функции возвращать Either AllTheErrors , который выражает диапазон ошибок, которые могут быть вызваны составной последовательностью этих функций. за счет выражения диапазона ошибок, возможных для каждой отдельной функции.

Есть ли способ получить и то, и другое? Может быть, с чем-то другим, кроме монадической композиции? Или с типами семейств (машет руками) ...?

18
задан jberryman 30 November 2011 в 03:39
поделиться