延迟提交的函数
Functions submitted lazily
我在研究 Paul Chiusano 和 Runar Bjanarson 合着的 "Functional Programming in 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 is the full code on Github. See here 用于 java.util.concurrent
文档。
我的问题是将函数作为惰性参数提供是什么意思?特别是,我可以理解懒惰地提供计算意味着什么,但我无法理解它在函数的情况下意味着什么?
supply a function as a lazy argument
因为 fork
函数有一个惰性参数 a: => Par[A]
,这意味着 a
不会在 fork(a)
时求值,直到它被提交给 ExecutorService
Callable
,由于a
的响应类型也是Par[A]
,它也会再次异步求值,也可以递归 fork执行相同的ExecutorService.
所以根据我的理解,fork
with lazy argument a: => Par[A]
,它将具有并行和递归fork任务的能力。
在Scala中,lazy function:意思是lazy evaluation直到调用这个函数。对于您的示例,您正在声明一个 惰性函数 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())
以上代码将输出如下:
second run
first run
因为作为 lazy function
提交 fun2()
将不会由 fun(fun2())
评估,它将在方法 fun
.
中评估
我在研究 Paul Chiusano 和 Runar Bjanarson 合着的 "Functional Programming in 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 is the full code on Github. See here 用于 java.util.concurrent
文档。
我的问题是将函数作为惰性参数提供是什么意思?特别是,我可以理解懒惰地提供计算意味着什么,但我无法理解它在函数的情况下意味着什么?
supply a function as a lazy argument
因为 fork
函数有一个惰性参数 a: => Par[A]
,这意味着 a
不会在 fork(a)
时求值,直到它被提交给 ExecutorService
Callable
,由于a
的响应类型也是Par[A]
,它也会再次异步求值,也可以递归 fork执行相同的ExecutorService.
所以根据我的理解,fork
with lazy argument a: => Par[A]
,它将具有并行和递归fork任务的能力。
在Scala中,lazy function:意思是lazy evaluation直到调用这个函数。对于您的示例,您正在声明一个 惰性函数 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())
以上代码将输出如下:
second run
first run
因为作为 lazy function
提交 fun2()
将不会由 fun(fun2())
评估,它将在方法 fun
.