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