Scala:如何理解Try的flatMap方法?

Cui*_*崔鹏飞 11 error-handling monads functional-programming scala try-catch

Success的flatMap方法实现如下:

  def flatMap[U](f: T => Try[U]): Try[U] =
    try f(value)
    catch {
      case NonFatal(e) => Failure(e)
    }
Run Code Online (Sandbox Code Playgroud)

我有点理解这个方法在做什么,它有助于我们避免编写大量的代码.

但它在什么意义上类似于常规flatMap?

常规flatMap采用一系列序列,并将所有元素放入一个大的"平面"序列中.

但是Try的flatMap方法并没有真正扁平化.

那么,如何理解Try的flatMap方法呢?

maa*_*asg 9

如果不进入monad,而不是根据集合来考虑它,你可以根据结构(集合变成具有许多条目的结构)来考虑它.

现在,看一下Try.flatmap(来自你的帖子)的签名:

def flatMap[U](f: T => Try[U]): Try[U]该函数f在Try [T]的上下文中将T转换为Try [U].

相比之下,假设操作是'map',结果将是:

def badMap[U](f: T => Try[U]): Try[Try[U]]

正如您所看到的,flatmap将结果"展平"到Try [T]的上下文中并生成Try[U]而不是嵌套Try[Try[U]].

如您所述,您可以将相同的"嵌套结构展平"概念应用于集合.


Shy*_*nki 5

您可能会认为 Try[T] 类似于仅包含一个元素的集合(如 Option[T])。

当“序列的序列”为“只有一个序列”时,map和flatmap几乎相似。唯一的区别是函数的签名。

在这种情况下不需要展平。