
Ionut G. Stan wrote:
Thank you all for the answers. It seems that a recurring reason is that being defined as a general type, Either can be used not only to handle errors, but choice in general. This, however, seems to make Either to overloaded in my opinion. If I decide that I want to use Either as a way to signal error, but a third party accepts Either for something different, then things will probably not work.
It's unlikely that the types would be compatible, unless you're using a type like Either String String. In that case, the solution may not be to switch to something other than Either, but rather to make the type more precise, like Either MyError MyValue, which can't be confused with other uses of Either. Keep in mind that a major point of the polymorphic type system in a language like Haskell is to be able to write typed code once and reuse it as widely as possible, so you should expect something as basic as choice between two alternatives to be represented by a very general type. A big advantage of using Either in a case like this is that any code written to operate on a general enough version of that type, such as "Either a b", may work just fine on your particular use of Either. That includes code which implements error monads, like these: http://hackage.haskell.org/packages/archive/transformers/0.2.1.0/doc/html/Co... http://hackage.haskell.org/packages/archive/mtl/1.1.0.2/doc/html/Control-Mon... or e.g. the Either utilities in MissingH: http://hackage.haskell.org/packages/archive/MissingH/1.1.0.3/doc/html/Data-E... By using Either, you're using the natural Haskell type for representing choice between two alternatives, that allows you to benefit from much of the code that's been written to use that type.
I have little experience with Haskell, but I haven't seen Either used in contexts other than error/success. If you could point me to some piece of code that uses it in a different way it would be great.
Choice between two alternatives is a pretty common requirement - think of it as the datatype equivalent of an 'if' expression. As a result, it's used quite a lot. There's an example in the main GHC driver program, http://darcs.haskell.org/ghc/ghc/Main.hs : type Mode = Either PreStartupMode PostStartupMode type PostStartupMode = Either PreLoadMode PostLoadMode Notice that it's not possible to confuse those types with something else. Further, using an alias defined with 'type', as in the above example allows you to name your type something relevant to your program, without losing the benefits of using a general type like Either. Anton