Как сделать выводы доступными для внутренней функции - PullRequest
2 голосов
/ 14 октября 2019

Я хотел бы определить неявное значение в функции-обертке и сделать его доступным для внутренней функции, пока мне удалось это сделать, передав неявную переменную из оболочки:

case class B()

trait Helper {
  def withImplicit[A]()(block: => A): A = {
    implicit val b: B = B()
    block
  }
}

class Test extends Helper {
  def useImplicit()(implicit b: B): Unit = {...}

  def test = {
    withImplicit() { implicit b: B =>
      useImplicit()
    }
  }
}

Можно ли избежатьimplicit b: B => и сделать implicit val b: B = B() доступным для внутреннего функционального блока?

1 Ответ

6 голосов
/ 14 октября 2019

Это будет возможно в Scala 3 с неявными типами функций (ключевое слово given вместо implicit)

case class B()

trait Helper {
  def withImplicit[A]()(block: (given B) => A): A = {
    given B = B()
    block
  }
}

class Test extends Helper {
  def useImplicit()(given b: B): Unit = {}

  def test = {
    withImplicit() {
      useImplicit()
    }
  }
}

https://dotty.epfl.ch/docs/reference/contextual/implicit-function-types.html

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

...