没有从 monadic 计算中提取值的一般方法

你可以将值包装到操作中,并将一个计算的结果输入到另一个计算中:

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

但是,Monad 的定义并不能保证 Monad m => m a -> a 类型的函数的存在。

这意味着通常无法从计算中提取值 (即展开它)。许多情况都是这种情况:

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

具体来说,没有功能 IO a -> a,这常常让初学者感到困惑; 看这个例子