簡體   English   中英

使用`implicit`參數聲明一個Function`type`

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM