Expressive and composable error types
问题 I am struggling with the best way to report errors in a set of functions that should compose nicely, in a library I'm working on. Concretely, I have functions that look like: foo, bar, baz :: a -> Maybe a where foo can fail in only one way (a good fit for Maybe ), but bar and baz can fail in two different ways each (good fits for Either BarErrors and Either BazErrors ). One solution is to create: data AllTheErrors = TheFooError | BarOutOfBeer | BarBurnedDown | ... and make all the functions