7

我想要一个高阶函数,它接受一个接受特定隐式参数的函数。

更准确地说,我正在尝试创建一个函数,该函数采用一个Future依赖于隐式上下文的创建方法并返回一个不依赖于上下文的方法。

更具体地说,假设我有这样的事情:

def foo(a: Int)(implicit ctx: ExecutionContext): Future[Float] = future { somelongBar... }

我想有这样的方法:

def provideCtx[A](func: ExecutionContext => A): A = {
     val ctx = setupCtx
     func(ctx)
}

但如果我调用provideCtx(foo),编译器会抱怨缺少隐式执行上下文。

我正在处理 ExecutionContext 的事实并不是很重要。我想找到的是如何编写参数类型以接受具有特定类型的隐式参数的函数。我知道隐式部分是一个 curryed 参数,所以实际上我有一个像这样的函数:ExecutionContext => Int => Future[Float],而且我很确定在运行时,jvm 不知道 ExecutionContext 是隐式的,但我不能编译器明白这一点。

4

1 回答 1

2

问题是它foo是一个方法,而不是一个函数,并且在隐式应用之前不会尝试 eta-expansion(将方法转换为函数)。有关详细信息,请参阅语言规范的第 6.26.2 节,并在此问题上进行更多讨论。

一种解决方法是编写如下内容:

provideCtx((ctx: ExecutionContext) => (a: Int) => foo(a)(ctx))

我不确定是否有更通用的解决方案(至少没有某种反射等),因为我们甚至不能foo在没有隐含范围的情况下引用(当然,方法调用除外)。

于 2013-09-05T12:08:51.697 回答