沒有從 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,這常常讓初學者感到困惑; 看這個例子