haskell - monad 转换器 MaybeT 中函数 "return"的两个定义

标签 haskell

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。这就是为什么第二个 MaybeTreturn 定义了完全相同的函数:

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/

相关文章:

Haskell主要函数

haskell - 类型级别的类型类可以用更高级别的类型来模拟吗?

list - Haskell 中的最长公共(public)前缀

c++ - 混合 Haskell 和 C++

haskell - attoparsec 中的条件先行

Haskell 编写一个函数来执行列表上的输入功能

Haskell : Will GHC optimize this?

http - Haskell SimpleHTTP 获取响应代码

haskell - 将 `Functor` 类泛化为 `MultiFunctor`?

java - 算法 - 如何有效地删除列表中的重复元素?