延迟提交的函数

时间:2019-01-27 15:03:15

标签: scala parallel-processing lazy-loading lazy-evaluation

当我研究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],而ExecutorServiceFuture来自java.util.concurrent库。 Here是Github上的完整代码。有关java.util.concurrent文档,请参见here

我的疑问是,提供函数作为惰性参数意味着什么?特别是,我可以理解延迟提供计算的含义,但是我很难理解函数的含义。

1 个答案:

答案 0 :(得分:1)

  

提供一个函数作为惰性参数

对于fork函数,它有一个惰性参数a: => Par[A],这意味着afork(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()求值。