Scala - 如何将隐式参数传递给函数(HOF)?
Scala - how to pass implicit parameter into function (HOF)?
我有这样的功能:
def getSomething: (String, Future[String]) => String = {
case (name, surname) if (name == "Joe", surname.map(s => s == "Doe")) => "Is ok"
}
但是编译器说他需要 executionContext
这里的 map
函数。我试着用以下方法施展魔法:
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 中,我们可以 return 带有隐式参数的函数,例如
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
是如何对应的。考虑来自 Change to (using x: T) => E
for context functions #8305
的示例
val f: Int ?=> Int = (using x: Int) => 2 * x
f(using 2)
我有这样的功能:
def getSomething: (String, Future[String]) => String = {
case (name, surname) if (name == "Joe", surname.map(s => s == "Doe")) => "Is ok"
}
但是编译器说他需要 executionContext
这里的 map
函数。我试着用以下方法施展魔法:
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 中,我们可以 return 带有隐式参数的函数,例如
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
是如何对应的。考虑来自 Change to (using x: T) => E
for context functions #8305
val f: Int ?=> Int = (using x: Int) => 2 * x
f(using 2)