【发布时间】:2013-12-10 07:48:02
【问题描述】:
Success的flatMap方法是这样实现的:
def flatMap[U](f: T => Try[U]): Try[U] =
try f(value)
catch {
case NonFatal(e) => Failure(e)
}
我有点理解这个方法的作用,它可以帮助我们避免编写大量捕获代码。
但是在什么意义上它与普通的 flatMap 相似呢?
一个普通的 flatMap 接受一个序列序列,并将所有元素放入一个大的“平面”序列中。
但是 Try 的 flatMap 方法并没有真正展平任何东西。
那么,如何理解 Try 的 flatMap 方法呢?
【问题讨论】:
-
搜索 monads/monoids 模式。 flatMap 将原始 A[T] 转换为 A[U]。 Option、Try、Future 不需要转换/展平。参见关于monads的非常古老的文档
-
方法
map和flatMap不是关于序列的,它们是关于单子的。有许多 monad 与任何类型的集合无关。Try和Future就是这些例子。 (虽然Try在技术上严格来说不是一个单子,但它对于大多数用途来说已经足够接近了。) -
但是,我的理解是 flatMap 之所以这样称呼,是因为它确实对序列进行了展平。因此,在将其应用于非集合单子时,至少会出现一些认知失调。除了“这不是汤,先生,这是肉汤”之外,要求解释和回答是合理的(c.f foreach,它具有相同的不和谐)。
-
@Paul:扁平化隐喻也符合更严格的 Monad 包装计算定义:它将转换的嵌套结构转换为扁平结构。您也可以将其替换为“展开”,而不会失去太多意义。
-
那么'foreach'呢? :) 说真的,这是有帮助的解释。谢谢。
标签: scala error-handling functional-programming try-catch monads