使用“隐式”参数声明一个函数“类型”
Declare a Function `type` with `implicit` parameters
是否可以通过某种方式声明类似
的东西
type F = (Int, Boolean)(implicit String) => Unit
在 Scala 中?
Scala 中 "function" 和 "method" 之间有一个非常重要的区别:
函数是值,不能按名称接受参数,不能是多态的,不能是可变的,不能重载,不能有隐式参数。虽然方法可以有这些,但它们不能作为值传递。
函数类型只是标准库中的特征,形式如下:
trait FunctionN[T1, ..., TN, R] {
def apply(x1: T1, ..., xN: TN): R
}
请注意这些类型中的 apply
方法如何 而不是 具有隐式参数列表。因此,函数永远不会有隐式参数。
所以如果你想传递带隐式参数的"functions",你必须创建你自己的特征:
trait Function2I1[T1, T2, I1, R] {
def apply(a1: T1, a2: T2)(implicit i1: I1): R
}
type F = Function2I1[Int, Boolean, String, Unit]
现在您可以创建 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
如果你想要没有隐式参数的柯里化函数,只需写(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
是否可以通过某种方式声明类似
的东西type F = (Int, Boolean)(implicit String) => Unit
在 Scala 中?
Scala 中 "function" 和 "method" 之间有一个非常重要的区别:
函数是值,不能按名称接受参数,不能是多态的,不能是可变的,不能重载,不能有隐式参数。虽然方法可以有这些,但它们不能作为值传递。
函数类型只是标准库中的特征,形式如下:
trait FunctionN[T1, ..., TN, R] {
def apply(x1: T1, ..., xN: TN): R
}
请注意这些类型中的 apply
方法如何 而不是 具有隐式参数列表。因此,函数永远不会有隐式参数。
所以如果你想传递带隐式参数的"functions",你必须创建你自己的特征:
trait Function2I1[T1, T2, I1, R] {
def apply(a1: T1, a2: T2)(implicit i1: I1): R
}
type F = Function2I1[Int, Boolean, String, Unit]
现在您可以创建 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
如果你想要没有隐式参数的柯里化函数,只需写(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