Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:重用函数值_Scala_Functional Programming - Fatal编程技术网

Scala:重用函数值

Scala:重用函数值,scala,functional-programming,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??) 我想重用2中1的功能 但我不知道该怎么做 最简单的实现方

我有以下两个功能:

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

  2)
  protected def withBag(body: Bag => Result): Future[Result] =
     withBagAsync(body??)
我想重用
2
1
的功能


但我不知道该怎么做

最简单的实现方式如下:

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=>Result
和一个
Result=>Future[Result
函数和
Future组合起来。成功的
就是一个
a=>Future[a]
函数,该函数在将来成功地包装参数

如果
withBag
body
参数可能会因异常而失败,或者如果需要在另一个线程中执行,等等,您可能需要类似以下内容:

import scala.concurrent.ExecutionContext

def withBag(body: Bag => Result)(implicit ec: ExecutionContext): Future[Result] =
  withBagAsync(bag => Future(body(bag)))

现在,调用者可以隐式或显式地提供执行上下文,由
body(bag)
引发的任何异常都将在失败的将来被捕获。

最简单的实现如下:

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=>Result
和一个
Result=>Future[Result
函数和
Future组合起来。成功的
就是一个
a=>Future[a]
函数,该函数在将来成功地包装参数

如果
withBag
body
参数可能会因异常而失败,或者如果需要在另一个线程中执行,等等,您可能需要类似以下内容:

import scala.concurrent.ExecutionContext

def withBag(body: Bag => Result)(implicit ec: ExecutionContext): Future[Result] =
  withBagAsync(bag => Future(body(bag)))

现在,调用方可以隐式或显式地提供执行上下文,以及
body(bag)引发的任何异常
将在失败的将来被捕获。

处理此问题的一种可能方法是让
withBagAsync
方法相信它接收的是一个函数而不是一个值,一个简单的解决方案是将调用作为

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

    withBagAsync(function)
  }

处理这个问题的一个可能方法是让
withBagAsync
方法相信它接收的是函数而不是值,一个简单的解决方案是将调用作为

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

    withBagAsync(function)
  }

你能提供一些方法的更多实现细节吗?你能提供一些方法的更多实现细节吗?