簡體   English   中英

傳遞性的暗示 - 這在Scala中是否可能?

[英]transitive implicits - is this possible in Scala?

假設我有幾個功能:

func1 : A => B

func2:  B => C

func3:  C => D

我想以通用方式在需要時協調現在的功能。

假設我需要從AB的轉換,我會調用func1 但是當我需要從AD的轉換時,我希望有這些函數的組合。 在動態的概念中,這樣的事情是否可能?

語言功能的Scala 文檔中 ,解釋了為什么必須在2.10中顯式啟用隱式轉換:

為何控制它? 眾所周知,如果過度使用隱式轉換會導致許多陷阱。 並且有過度使用它們的傾向,因為它們看起來非常強大,它們的效果似乎很容易理解。 此外,在大多數情況下,使用隱式參數會導致比隱式轉換更好的設計。

用戶定義的隱式轉換幾乎總是一個壞主意,並且使它們傳遞會更加糟糕。

但是,您可以使用類型類以更安全,更受控制的方式獲得類似的效果。 例如,假設我們有以下內容:

trait MyConverter[A, B] { def apply(a: A): B }

implicit def composeMyConverters[A, B, C](implicit
  ab: MyConverter[A, B],
  bc: MyConverter[B, C]
) = new MyConverter[A, C] { def apply(a: A) = bc(ab(a)) }

現在我們可以寫:

implicit object doubleToString extends MyConverter[Double, String] {
  def apply(d: Double) = d.toString
}

implicit object intToDouble extends MyConverter[Int, Double] {
  def apply(i: Int) = i.toDouble
}

def convertToString[A](a: A)(implicit as: MyConverter[A, String]) = as(a)

最后:

scala> convertToString(13: Int)
res0: String = 13.0

我們從未明確定義從整數到字符串的轉換器,但編譯器能夠使用我們的composeMyConverters方法在需要時構造一個。

與隱式轉換一樣,這種方法也可能被濫用,但要更加容易地了解轉換器的范圍,應用位置等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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