scala折叠如何工作?

Maa*_*mon 8 scala akka scala-collections

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

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

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

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

dk1*_*k14 9

阿卡的child回归Option

正如你从Optionscaladoc中看到的那样:

fold [B](ifEmpty:⇒B)(f:(A)⇒B):B如果scala.Option为非空,则返回将f应用于此scala.Option的值的结果.否则,计算表达式ifEmpty.

或者说得更清楚:

这个(fold)相当于scala.Option map f getOrElse ifEmpty.

所以第一个参数fold是lazy(call-by-name),只有在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
Run Code Online (Sandbox Code Playgroud)

以下是一些有关以下内容的读物:

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()具有正确的契约时(但并不意味着它们更具可读性).