Is there a built-in function with signature :: (Monad m) => m a -> a
?
Hoogle tells that there is no such function.
Can you explain why?
A monad only supplies two functions:
return :: Monad m => a -> m a
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Both of these return something of type m a
, so there is no way to combine these in any way to get a function of type Monad m => m a -> a
. To do that, you'll need more than these two functions, so you need to know more about m
than that it's a monad.
For example, the Identity
monad has runIdentity :: Identity a -> a
, and several monads have similar functions, but there is no way to provide it generically. In fact, the inability to "escape" from the monad is essential for monads like IO
.