Scala Lifting to a thunk

Scala Lifting to a thunk

我有一个函数将另一个函数的结果包装在 Promise 中。我想将其提升为提升功能,以便我可以在其他地方重新使用它。以下是原始定义:

val abc = Promise[MyType]()
try {
  val suck = abc.success(someOtherFunction(intParam1, intParam2))
} catch {
  case ex: Exception => p.failure(ex)
}

所以我最终做了以下事情:

def myLiftFunc[X](x: X) (op: => X): Promise[X] = {
  val p = Promise[X]()

  try {
    p.success(op)
  } catch {
    case NonFatal(ex) =>
    p.failure(ex)
  }
  p
}

如何重新使用它?我的意思是,我传入的第二个参数应该是一个 thunk,这样我就可以传入任何函数体,而不考虑函数体需要的参数!

当我调用提升函数时:

myLiftFunc(someOtherFunction(intParam1, intParam2))

这是 Int => Promise[Int] 类型,其中 someOtherFunction returns 和 Int。当我调用 myLiftFunc!

时,我只想 Promise[Int]

您可能对 Promise.fromTry 方法感兴趣。该方法使用 scala.util 中的 Try 习语,这是一个有用的结构,允许您将 try...catch 语句更像传统结构:

Promise.fromTry { Try { someOtherFunction(intParam1, intParam2) } }

如果你想纠正你自己的助手(这样 Try 部分是不必要的,你可以尝试这样的事情:

def myLiftFunc[X](op: => X): Promise[X] = Promise.fromTry(Try(op))

这将使您能够:

myLiftFunc { /*arbitrary logic*/ }
myLiftFunc(1 + 4).future.value.get //Success(5)
myLiftFunc(1/0).future.value.get //Failure(java.lang.ArithmeticException: / by zero)