【发布时间】:2014-03-12 12:00:45
【问题描述】:
我的理解如下:
假设 M1 和 M2 是单子,即它们提供符合单子定律的函数 unit 和 flatMap。不幸的是,我们不能为 M1[M2] 创建 unit 和 flatMap。看起来unit 和flatMap 并不总是 存在于任何 M1 和M2。我不知道我们是否需要证明这一点。
因此解决方案是为M1[M2] 创建一个包装器 W,以便W[M1, M2] 是 一个monad,并使用它来代替。这个包装器 W 称为 Monad Transformer。
我理解正确吗?
【问题讨论】:
-
快速手动回答:monad 在一般情况下不会组合,但有时特定的 monad 会,并且 monad 转换器提供了一种实现组合的方法。请注意,monad 转换器不是本身就是一个 monad——你的总结在这一点上可能是模棱两可的。
-
@TravisBrown 谢谢。我确信 monad 转换器 本身就是一个 monad。例如,
ListT是一个单子吗?它似乎同时提供unit和flatMap。 -
ListT一旦被应用到一个 monad 就是一个 monad,所以ListT[Option, _]就是一个 monad(从道德上讲——这当然不是有效的 Scala 语法)。 -
@TravisBrown 谢谢。现在我知道了。 (我会解决这个问题)
标签: scala functional-programming monads monad-transformers