Scala - как передать неявный параметр в функцию (HOF)? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть такая функция:

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

Но компилятор сказал, что ему нужно executionContext здесь, в map функции. Я пытался сделать магию c с:

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

или

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

Но это не работает. Можно ли передать неявный параметр для функции, как это? Или я мог бы сделать это по-другому?

Ответы [ 2 ]

5 голосов
/ 03 апреля 2020
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

2 голосов
/ 03 апреля 2020

В 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 в функциональном литерале. Рассмотрим пример из Измените на (using x: T) => E для контекстных функций # 8305

val f: Int ?=> Int = (using x: Int) => 2 * x
f(using 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...