Scala中具有隐式参数的函数类型

Scala中具有隐式参数的函数类型,scala,implicit,currying,higher-order-functions,Scala,Implicit,Currying,Higher Order Functions,我想要一个高阶函数,它接受一个参数,一个接受特定隐式参数的函数 更准确地说,我试图创建一个函数,该函数采用依赖于隐式上下文的Future创建方法,并返回一个不依赖于上下文的方法 更具体地说,假设我有这样的东西: def foo(a: Int)(implicit ctx: ExecutionContext): Future[Float] = future { somelongBar... } def provideCtx[A](func: ExecutionContext => A): A

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

更准确地说,我试图创建一个函数,该函数采用依赖于隐式上下文的
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((ctx: ExecutionContext) => (a: Int) => foo(a)(ctx))
我希望有这样一种方法:

def foo(a: Int)(implicit ctx: ExecutionContext): Future[Float] = future { somelongBar... }
def provideCtx[A](func: ExecutionContext => A): A = {
     val ctx = setupCtx
     func(ctx)
}
provideCtx((ctx: ExecutionContext) => (a: Int) => foo(a)(ctx))
但是如果我调用
provideCtx(foo)
,编译器会抱怨隐式执行上下文丢失


事实上,我处理的是一个执行上下文并不十分重要。我想了解的是如何编写参数类型以接受具有特定类型的隐式参数的函数。我知道隐式部分是一个curryd参数,所以事实上我有一个类似这样的函数:
ExecutionContext=>Int=>Future[Float]
,我非常确定在运行时,jvm不知道ExecutionContext是隐式的,但是我不能让编译器理解这一点。

问题是
foo
是一个方法,而不是函数,eta扩展(将方法转换为函数)直到隐式应用程序之后才尝试。有关详细信息和其他讨论,请参见语言规范第6.26.2节

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

def foo(a: Int)(implicit ctx: ExecutionContext): Future[Float] = future { somelongBar... }
def provideCtx[A](func: ExecutionContext => A): A = {
     val ctx = setupCtx
     func(ctx)
}
provideCtx((ctx: ExecutionContext) => (a: Int) => foo(a)(ctx))

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

事实上,我现在写了一些非常类似的东西,只是有点麻烦。