Scala折叠是如何工作的?

8
我正在尝试理解以下代码,但无法理解。
它应该是为一个事件创建一个子Actor,如果不存在的话,否则会说明该事件已经存在,因为它有一个关联的子Actor。
但是这里的fold对我来说没有意义。如果context.child为空,我们会得到创建,我理解这一点。然而,如果存在子Actor,为什么我们仍然要创建呢?
1个回答

9

Akka的child返回一个Option

如您从Option的scaladoc中所见:

fold[B](ifEmpty:⇒B)(f:(A)⇒B):B 返回应用f到这个scala.Option的值的结果,如果scala.Option是非空的。否则,计算表达式ifEmpty。

或者更明确地说:

这(fold)等同于scala.Option map f getOrElse ifEmpty。

因此,fold的第一个参数是lazy(按名称调用),仅在Option为空时才进行评估。第二个参数(一个函数)仅在Option不为空时调用。

实验:

scala> Some(0).fold({println("1");1}){_ => println("2"); 2}
2
res0: Int = 2

scala> None.fold({println("1");1}){_ => println("2"); 2}
1
res1: Int = 1

这里是关于以下内容的阅读材料:

https://kwangyulseo.com/2014/05/21/scala-option-fold-vs-option-mapgetorelse/

还有一些对这种方法持批评态度的人:

http://www.nurkiewicz.com/2014/06/optionfold-considered-unreadable.html

但是在Option.fold()中,合同不同:折叠函数只需要一个参数而不是两个。如果您阅读了我之前关于folds的文章,您就会知道,减少函数总是需要两个参数:当前元素和累加值(在第一次迭代期间的初始值)。但是Option.fold()只需要一个参数:当前Option值!这破坏了一致性,特别是当意识到Option.foldLeft()和Option.foldRight()具有正确的合同时(但这并不意味着它们更易读)。

非常感谢详细的解释。我根据中性参数的懒惰构建了一个解释,考虑到它在函数中没有使用,因为它不能用于两个参数,我认为它永远不会被调用。这与您讲述的相似,事实上该函数只有一个参数。知道这种差异很好,谢谢。 - MaatDeamon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接