繁体   English   中英

scala折叠如何工作?

[英]how scala folding works?

我试图理解以下代码但不能。

如果事件不存在,它应该为事件创建一个子actor,否则表示事件与关联的子actor一样存在。

context.child(name).fold(create())(_ => sender()!EventExists)

但这里的折叠对我来说没有意义。 如果context.child是emtpty我们得到了创作,我明白了。 但是,如果有孩子,我们仍然会创造原因吗?

Akka的child返回一个Option

正如您从Option的scaladoc中看到的那样:

fold [B](ifEmpty:⇒B)(f:(A)⇒B):B如果scala.Option为非空,则返回将f应用于此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()中,契约是不同的:折叠函数只需要一个参数而不是两个参数。 如果您阅读我之前关于折叠的文章,您就知道减少函数总是需要两个参数:当前元素和累积值(第一次迭代时的初始值)。 但Option.fold()只接受一个参数:当前选项值! 这打破了一致性,特别是在实现Option.foldLeft()和Option.foldRight()具有正确的契约时(但并不意味着它们更具可读性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM