延迟提交的函数

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]ExecutorServiceFuture 来自 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.

中评估