要了解发生了什么,请考虑这个更简单的例子:
ghci> import Data.Maybe
ghci> weird = return Nothing
ghci> weird
Nothing
ghci> weird == Nothing
False
ghci> isNothing weird
False
ghci> :t weird
weird :: Monad m => m (Maybe a)
ghci>
当你刚刚进入
weird
,GHCi默认值
m
成为
IO
(所以总体类型是
IO (Maybe a)
),然后为您评估IO操作,结果为
Nothing
.当你进入
weird == Nothing
或
isNothing weird
,
m
被迫
Maybe
(所以总体类型是
Maybe (Maybe a)
),所以
return Nothing
成为
Just Nothing
,这与
没有什么
.
你的例子有几个额外的间接层,但最终,同样的事情也在发生。
runIdentityT
这是转移注意力;你的表达式是如此的多态,以至于它在任何地方都不做任何事情。
如果你不明白为什么你的表情基本上和
return无
,记住
mzero
您正在使用的定义如下:
instance (Monad m) => MonadPlus (MaybeT m) where
mzero = MaybeT (return Nothing)
不是这个:
instance (MonadPlus m) => MonadPlus (MaybeT m) where
mzero = MaybeT mzero