Scala 懒散提交的函数
我在学习Paul Chiusano和Runar Bjanarson(第7章-纯函数并行性)的《Scala中的函数编程》一书时遇到了这个函数定义:Scala 懒散提交的函数,scala,parallel-processing,lazy-loading,lazy-evaluation,Scala,Parallel Processing,Lazy Loading,Lazy Evaluation,我在学习Paul Chiusano和Runar Bjanarson(第7章-纯函数并行性)的《Scala中的函数编程》一书时遇到了这个函数定义: Par[A]是type Par[A]=ExecutorService=>Future[A]和ExecutorService和Future来自java.util.concurrent库。是Github上的完整代码。有关java.util.concurrent文档,请参阅 我的问题是,作为惰性参数提供函数意味着什么?特别是,我可以理解懒散地提供计算意味着什
Par[A]
是type Par[A]=ExecutorService=>Future[A]
和ExecutorService
和Future
来自java.util.concurrent
库。是Github上的完整代码。有关java.util.concurrent
文档,请参阅
我的问题是,作为惰性参数提供函数意味着什么?特别是,我可以理解懒散地提供计算意味着什么,但我很难理解它在函数的情况下意味着什么
提供一个函数作为惰性参数
因为fork
函数有一个惰性参数a:=>Par[a]
,这意味着a
在fork(a)
时将不会求值,直到它以可调用的提交给ExecutorService
,因为a
的响应类型也是Par[a]
,它还会再次异步求值,还可以使用相同的执行器服务递归执行fork
因此,就我的理解而言,fork
具有惰性参数a:=>Par[a]
,它将具有并行和递归fork任务的能力
在Scala中,惰性函数:它表示惰性求值,直到调用此函数为止。例如,您正在声明一个惰性函数a:=>Par[a]
,因此当您调用fork
方法,如:fork(myFunction())
,它不会立即计算myFunction
,只会在a(es)时进行计算。执行
例如:
def fun(a: => Int): Int = {
println("second run")
a
}
def fun2(): Int = {
println("first run")
1 + 1
}
fun(fun2())
上述代码的输出如下:
第二轮
首轮
由于提交fun2()
作为一个惰性函数
将不会通过fun(fun2())
进行计算,它将在方法fun
中进行计算,这根本无法解决问题。这个问题特别是关于=>(ExecutorService=>Future[A])
作为输入类型。是的,在这个上下文中查看它会非常有帮助。但是,@chengpohi的回答也帮助了我。特别是,如果fun没有懒散地接受它的论点,那么我们会看到“第一次运行”在“第二次运行”之前,对吗@AndreyTyukin@clog14对不起,我误解了这个问题:(,我已经更新了我的答案,希望能有所帮助。@chengpohi非常感谢你让我的答案更精确一点。但是,我还是觉得有点不确定。你能解释一下如果函数不懒洋洋地接受它的参数会发生什么吗?@clog14,如果不懒洋洋地接受它的参数,它会立即求值,例如:fork(a)+fork(b)
,bothfork
函数不能并行运行,它将按顺序运行,如果我们让参数是惰性的,则bothfork
可以并行运行。
def fun(a: => Int): Int = {
println("second run")
a
}
def fun2(): Int = {
println("first run")
1 + 1
}
fun(fun2())