[英]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.