Haskell Language No general way to extract value from a monadic computation


You can wrap values into actions and pipe the result of one computation into another:

return :: Monad m => a -> m a
(>>=)  :: Monad m => m a -> (a -> m b) -> m b

However, the definition of a Monad doesn’t guarantee the existence of a function of type Monad m => m a -> a.

That means there is, in general, no way to extract a value from a computation (i.e. “unwrap” it). This is the case for many instances:

extract :: Maybe a -> a
extract (Just x) = x          -- Sure, this works, but...
extract Nothing  = undefined  -- We can’t extract a value from failure.

Specifically, there is no function IO a -> a, which often confuses beginners; see this example.