没有从 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
,这常常让初学者感到困惑; 看这个例子 。