Either [Char] a -> IO a function

haskell

Solution

One simple definition is:

f :: Either String a -> IO a
f = either (ioError . userError) return

Note that we can make this generic with `fail`, but it's really a historical accident that `fail` is in `Monad` to begin with, so I wouldn't use this definition:

f :: Monad m => Either String a -> m a
f = either fail return

A better generic version might use the `MonadError` class:

import Control.Monad.Error.Class

f :: MonadError e m => Either String a -> m a
f = either (throwError . strMsg) return

Problem

How can I write a function so that `Left x` to an IO error but `Right x` returns its result as usual, i.e. the function has signature `Either [Char] a -> IO a`? Basically I want the `Left err` result to become the `err` in the IO Monad.

Original source