使用`implicit`参数声明一个Function`type`

scr*_*avy 16 scala implicit

是否有可能宣布类似的东西

type F = (Int, Boolean)(implicit String) => Unit
Run Code Online (Sandbox Code Playgroud)

在斯卡拉?

Ven*_*Ven 22

Scala在"function"和"method"之间有一个非常重要的区别:

函数是值,并且不能通过名称取参数,不能是多态的,不能是可变参数,不能重载,也不能有隐式参数.虽然方法可以具有这些,但它们不能作为值传递.

函数类型只是标准库中的特征,具有以下形式:

trait FunctionN[T1, ..., TN, R] {
  def apply(x1: T1, ..., xN: TN): R
}
Run Code Online (Sandbox Code Playgroud)

请注意apply这些类型中的方法没有隐式参数列表.因此,函数永远不会有隐式参数.

因此,如果要传递带有隐式参数的"函数",则必须创建自己的特征:

trait Function2I1[T1, T2, I1, R] {
  def apply(a1: T1, a2: T2)(implicit i1: I1): R
}

type F = Function2I1[Int, Boolean, String, Unit]
Run Code Online (Sandbox Code Playgroud)

现在您可以创建类型的实例F(尽管没有闪亮的lambda语法):

val f = new F {
  override def apply(x: Int, y: Boolean)(implicit z: String): Unit = ???
}
implicit val x = "hi"
f(1, true) // implicitly passes x
Run Code Online (Sandbox Code Playgroud)

如果你想要没有隐式参数的curried函数,那就写吧(Int, Boolean) => String => Unit.

如果要将方法转换为函数,请使用lambda:

class A {
  def f(a: String)(implicit b: String): String = a + b
}
val a = new A
val m = a.f(_) // takes the implicit in this scope
Run Code Online (Sandbox Code Playgroud)