MaybeT 定义为
newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }
而且,MaybeT m 也是 Monad 类的实例,函数 return
定义如下
return = MaybeT . return . Just
但我读到 “也可以(尽管可读性较差)写 return = MaybeT .return .return”
,这让我感到困惑。
如何返回 = MaybeT 。返回 。 return
等于 return = MaybeT 。返回 。只是
?
最佳答案
考虑 MaybeT
的定义:
newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }
第一个return
定义(从下往上读):
return =
MaybeT . -- put `m (Maybe a)` into `MaybeT`: MaybeT (m (Maybe a))
return . -- put `Maybe a` into external monad: m (Maybe a)
Just -- put value into `Maybe`: Maybe a
Maybe
也是一个 monad。它的return
是一个Just
。这就是为什么第二个 MaybeT
的 return
定义了完全相同的函数:
return =
MaybeT . -- put `m (Maybe a)` into `MaybeT`: MaybeT (m (Maybe a))
return . -- put `Maybe a` into external monad: m (Maybe a)
return -- it's the same as `Just` for `Maybe`: Maybe a
关于haskell - monad 转换器 MaybeT 中函数 "return"的两个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26820186/