Scala:重用函数值

时间:2019-01-29 12:35:25

标签: scala functional-programming

我有以下两个功能:

  1)
  protected def withBagAsync(body: Bag => Future[Result]): Future[Result] = {
  //... implementation
  }

  2)
  protected def withBag(body: Bag => Result): Future[Result] =
     withBagAsync(body??)

我想重用12的功能。

但是我不知道该怎么做。

2 个答案:

答案 0 :(得分:4)

最直接的实现是这样的:

def withBag(body: Bag => Result): Future[Result] =
  withBagAsync(bag => Future.successful(body(bag))

或者,或多或少等效:

def withBag(body: Bag => Result): Future[Result] =
  withBagAsync(body.andThen(Future.successful))

您需要将Bag => Result转换为Bag => Future[Result],最简单的方法是组合给定的Bag => ResultResult => Future[Result函数,以及{{ 1}}是一个Future.successful函数,可以在成功的将来包装参数。

如果A => Future[A]的{​​{1}}参数可能因异常而失败,或者如果您需要在另一个线程中执行它,等等,那么您可能需要这样的东西:

body

现在,调用者可以隐式或显式提供执行上下文,并且withBag引发的任何异常都将在失败的将来被捕获。

答案 1 :(得分:0)

处理此问题的一种可能方法是使withBagAsync方法认为它正在接收函数而不是值,而一种简单的解决方案是将调用设为

protected def withBag(body: Bag => Result): Future[Result] =
  {
    val function: Bag => Future[Result] = (body: Bag) => Future.successful(Result())

    withBagAsync(function)
  }