Функции представлены лениво - PullRequest
0 голосов
/ 27 января 2019

Я сталкивался с определением этой функции при изучении книги Пола Кьюзано и Рунара Бьянарсона «Функциональное программирование в 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. Здесь - полный код на Github.См. здесь для документации java.util.concurrent.

Мои вопросы, что означает предоставление функции в качестве ленивого аргумента?В частности, я могу понять, что означает лениво выполнять вычисления, но мне трудно понять, что это означает в случае функций?

1 Ответ

0 голосов
/ 27 января 2019

предоставляет функцию в качестве ленивого аргумента

Поскольку fork функция имеет ленивый аргумент a: => Par[A], это означает, что a не будет вычисляться при fork(a) до тех пор, покаотправлено на ExecutorService с Callable, так как тип ответа a также Par[A], он также будет асинхронно вычисляться снова и также может рекурсивно fork выполняться с тем же ExecutorService.

Так что для моего понимания, fork с ленивым аргументом a: => Par[A], он будет иметь возможность параллельных и рекурсивных форка задач.


In Scala , Ленивая функция : это означает Ленивая оценка до вызова этой функции.для вашего примера, вы объявляете ленивую функцию 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() как lazy function не будет оцениваться по fun(fun2()), и будет оцениваться по методу fun.

...