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方法呢?
如果不进入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]].
如您所述,您可以将相同的"嵌套结构展平"概念应用于集合.
您可能会认为 Try[T] 类似于仅包含一个元素的集合(如 Option[T])。
当“序列的序列”为“只有一个序列”时,map和flatmap几乎相似。唯一的区别是函数的签名。
在这种情况下不需要展平。