scala - Scala 中带有隐式参数的函数类型

标签 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 = {
     val ctx = setupCtx
     func(ctx)
}

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

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

最佳答案

问题是foo是一个方法,而不是一个函数,并且在隐式应用之后才会尝试 eta-expansion(将方法转换为函数)。有关详细信息,请参阅语言规范的第 6.26.2 节和 this issue以供进一步讨论。

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

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

我不确定更通用的解决方案是否可行(至少没有某种反射等),因为我们甚至无法引用 foo (当然,除了在方法调用中)没有隐式作用域。

关于scala - Scala 中带有隐式参数的函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18602736/

相关文章:

Scala 递归 API 调用以获取所有结果

javascript - Play Framework 不会运行内联 javascript

c++ - 从 operator== 隐式调用构造函数

haskell - 隐式参数和函数

scala - scala中根集合和不可变集合之间的区别

scala - 使用绑定(bind)在类类型参数中的上下文

Scala 柯里化(Currying)示例

typescript - 为 TypeScript 中的重载捕获传递函数的泛型类型

javascript - 我可以让这个函数定义更短吗?

scala - 如何将 Spark 中 `Dataframe` 的两列合并为一个 2 元组?