当我研究Paul Chiusano和Runar Bjanarson的著作《 Scala中的函数编程》(第7章-纯函数并行性)时,遇到了这个函数定义:
def fork[A](a: => Par[A]): Par[A] =
es => es.submit(new Callable[A] {
def call = a(es).get
})
Par[A]
是type Par[A] = ExecutorService => Future[A]
,而ExecutorService
和Future
来自java.util.concurrent
库。 Here是Github上的完整代码。有关java.util.concurrent
文档,请参见here。
我的疑问是,提供函数作为惰性参数意味着什么?特别是,我可以理解延迟提供计算的含义,但是我很难理解函数的含义。
答案 0 :(得分:1)
提供一个函数作为惰性参数
对于fork
函数,它有一个惰性参数a: => Par[A]
,这意味着a
在fork(a)
之前不会与{{ 1}},由于ExecutorService
的响应类型也为Callable
,因此它将再次异步评估,并且还可以递归派生使用相同的 ExecutorService 强>。
因此,根据我的理解,带有 lazy参数 a
的{{1}}具有并行和递归分叉任务的功能。
在 Scala 中,惰性函数:表示惰性评估,直到调用此函数。以您的示例为例,您声明的是惰性函数 Par[A]
,因此,当您调用fork
之类的a: => Par[A]
方法时,该方法将不会评估a: => Par[A]
立即执行,只有在执行fork
时它才会生效。
示例:
fork(myFunction())
上面的代码将输出为:
第二次跑
首次运行
因为以myFunction
的身份提交a(es).get
不会被def fun(a: => Int): Int = {
println("second run")
a
}
def fun2(): Int = {
println("first run")
1 + 1
}
fun(fun2())
求值,它将以方法fun2()
求值。