Estoy luchando con la mejor manera de informar errores en un conjunto de funciones que deberían componer muy bien, en una biblioteca en la que estoy trabajando.Tipos de error expresivo y composable
Concretamente, me tienen funciones que se parecen:
foo, bar, baz :: a -> Maybe a
donde foo
se puede dejar en un solo sentido (un buen ajuste para Maybe
), pero bar
y baz
puede fallar en dos formas diferentes, cada uno (buenos ajustes para Either BarErrors
y Either BazErrors
).
Una solución es crear:
data AllTheErrors = TheFooError
| BarOutOfBeer
| BarBurnedDown
| ...
y hacer todas las funciones devuelven Either AllTheErrors
, que expresa la gama de errores que pueden ser planteadas por una secuencia compuesta de estas funciones a expensas de expresar la rango de errores posible para cada función individual.
¿Hay alguna manera de obtener ambos? Tal vez con algo más que la composición monádica? O con familias tipo (manos de las olas) ...?
¡Brillante, gracias! – jberryman
Después de investigar un poco, lo que creo que se adaptará a mi biblioteca es definir polimórficamente las funciones de mi biblioteca en la clase 'Failure' del paquete 'failure', aquí: http://hackage.haskell.org/package/failure. Eso me permite expresar los tipos de excepciones que pueden surgir en el tipo sig, y les da a mis usuarios la opción de usar algo simple como 'Maybe', o algo más robusto como control-monad-exception (que proporciona una instancia). Gracias de nuevo. – jberryman