Составление последовательности функций, которые возвращают будущее - PullRequest
1 голос
/ 26 октября 2019

Я ищу элегантный способ составления последовательности функций, которые возвращают Future. Т.е. для последовательности (f1, f2, ..., f_n), каждая функция имеет тип T=>Future[T], я хочу создать новую функцию g, где g(x) = f_n(...f2(f1(x))...).

Моя реализация выглядит следующим образом:

  def doInOrder[T] (fs : (T => Future[T])*)(implicit ec:ExecutionContext): T=>Future[T] = {
    (t:T) => {
      fs.reduceLeft((future1: T=>Future[T], future2: T=>Future[T]) =>
        (arg:T) => future1(arg).flatMap((arg2:T) => future2(arg2))
      )(t)
    }
  }

Насколько я могу судить, это работает. Решение кажется немного запутанным, хотя с несколькими вложенными лямбдами. Можно ли это упростить?

Проблема взята из книги Хорстманна Скала для нетерпеливого , в которой просит

Написать функциюdoInOrder, что, учитывая две функции f: T => Future[U] и g: U => Future[V], производит функцию T => Future[U], которая для данного t в конечном итоге приводит к g(f(t))

, а затем к:

Повторите предыдущее упражнение для любой последовательности функций типа T => Future[T].

1 Ответ

2 голосов
/ 26 октября 2019

Как насчет этого?

def doInOrder[T] (fs : (T => Future[T])*)(implicit ec:ExecutionContext): T=>Future[T] = {
    t => fs.foldLeft(Future.successful(t))((acc, f) => acc.flatMap(f))
  }
...