[英]Declare a Function `type` with `implicit` parameters
是否有可能宣布類似的東西
type F = (Int, Boolean)(implicit String) => Unit
在斯卡拉?
Scala在“function”和“method”之間有一個非常重要的區別:
函數是值,並且不能通過名稱取參數,不能是多態的,不能是可變參數,不能重載,也不能有隱式參數。 雖然方法可以包含這些,但它們不能作為值傳遞。
函數類型只是標准庫中的特征,具有以下形式:
trait FunctionN[T1, ..., TN, R] {
def apply(x1: T1, ..., xN: TN): R
}
請注意這些類型中的apply
方法沒有隱式參數列表。 因此,函數永遠不會有隱式參數。
因此,如果要傳遞帶有隱式參數的“函數”,則必須創建自己的特征:
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
如果你想要沒有隱式參數的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.