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文档,请参阅 我的问题是,作为惰性参数提供函数意味着什么?特别是,我可以理解懒散地提供计算意味着什

我在学习Paul Chiusano和Runar Bjanarson(第7章-纯函数并行性)的《Scala中的函数编程》一书时遇到了这个函数定义:

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)
,both
fork
函数不能并行运行,它将按顺序运行,如果我们让参数是惰性的,则both
fork
可以并行运行。
def fun(a: => Int): Int = {
  println("second run")
  a
}

def fun2(): Int = {
  println("first run")
  1 + 1
}

fun(fun2())