Scala-如何将隐式参数传递到函数(HOF)中



我有一个这样的函数:

def getSomething: (String, Future[String]) => String = {
case (name, surname) if (name == "Joe", surname.map(s => s == "Doe")) => "Is ok"
}

但编译器说他需要map函数中的executionContext。我试着用做一些魔术

def getSomething (implicit e: ExecutionContext): (String, Future[String]) => String{...}

def getSomething: (String, Future[String])(implicit e: ExecutionContext) => String{...}

但它不起作用。有可能将隐式参数传递给这样的函数吗?或者我可以换一种方式吗?

def getSomething (implicit e: ExecutionContext): (String, Future[String]) => String = ...

应该起作用。

你不能写

(String, Future[String]) => (implicit e: ExecutionContext) => String

隐式函数将出现在Scala 3中。

http://dotty.epfl.ch/docs/reference/contextual/context-functions.html

http://dotty.epfl.ch/blog/2016/12/05/implicit-function-types.html

在Scala 3中,我们可以返回一个带有隐式参数的函数,例如

def getSomething: ExecutionContext ?=> Future[String] => Future[Int] = {
(using ec: ExecutionContext) => (f: Future[String]) => f.map(_.toInt)
}
given fiveThreadsEc as ExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(5))
getSomething(Future("42"))

注意函数类型中的?=>与函数文字中的using是如何对应的。考虑上下文函数#8305 从Change到(using x: T) => E的示例

val f: Int ?=> Int = (using x: Int) => 2 * x
f(using 2)

最新更新