Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell's Either v. Error

Tags:

haskell

Learn You a Haskell presents Error:

instance (Error e) => Monad (Either e) where  
    return x = Right x   
    Right x >>= f = f x  
    Left err >>= f = Left err  
    fail msg = Left (strMsg msg) 

Hackage presents Either:

data Either a b = Left a | Right b

If I understand correctly, then Error is a Monad with Either as it's a type. Also, it looks like there's a fail to handle exceptions.

But, I also see that there's a Control.Monad.Either too - http://hackage.haskell.org/package/category-extras-0.53.4/docs/Control-Monad-Either.html.

Why would Control.Monad.Error be chosen over Control.Monad.Either, and vice-versa?

like image 307
Kevin Meredith Avatar asked Aug 24 '14 14:08

Kevin Meredith


People also ask

How does either work in Haskell?

In Haskell either is used to represent the possibility of two values. Either is used to represent two values that can be correct or error. It has two constructors also which are named Left and Right. These constructors also represent and show some purpose either in Haskell.

What is Either type?

The Either type is sometimes used to represent a value which is either correct or an error; by convention, the Left constructor is used to hold an error value and the Right constructor is used to hold a correct value (mnemonic: "right" also means "correct").

What is either Monad?

In Error handling we have two possible paths either a computation succeeds or fails. The imperative way to control the flow is using exceptions and a try/catch block.

What is error in Haskell?

On the one hand, an error is a programming mistake such as a division by zero, the head of an empty list, or a negative index. If we identify an error, we remove it. Thus, we don't handle errors, we simply fix them. In Haskell, we have error and undefined to cause such errors and terminate execution of the program.


1 Answers

No, Error is not a monad. Either e is a monad, and Error e was a typeclass prerequisite for the Monad instance for Either e to exist. Basically Error e means that e is a type which you can convert error messages into with strMsg, which was used for Either e's fail method.

However, people found this requirement to have an Error e instance just to be able to use Either e as a monad annoying, so after LYAH was written it was actually removed. Now the instance is just

instance Monad (Either e) where
    return = Right
    Left  l >>= _ = Left l
    Right r >>= k = k r

and fail instead uses the default from the Monad class definition:

fail s      = error s

However, the Error e requirement is still (as of newest Haskell Platform at least) required for the monads and transformers defined in Control.Monad.Error, while Control.Monad.Either leaves out that requirement.

like image 180
Ørjan Johansen Avatar answered Sep 23 '22 20:09

Ørjan Johansen