Якщо я маю неявну думку від A
до B
, як я можу отримати автоматичні підказки F[A]
до F[B]
?
Наприклад, якщо у мене є implicit toInt[A](l: List[A]) = l.size
і тепер я хочу мати неявне з (List[A], Int)
до (Int, Int)
який повторно використовує toInt
неявна. Це можливо навіть у Скалі?
Відповіді:
4 для відповіді № 1Імпліцити можуть використовувати інші імпліцити для перетворення значень. Так дано ваше toInt
:
implicit def toInt[A](l: List[A]): Int = l.size
Ми можемо визначити неявне перетворення для перетворення першого елемента 2-кортежа в Int
, наприклад (List[Int], Int)
до (Int, Int)
:
implicit def tupleConvert[A <% Int, C](x: (A, C)): (Int, C) = (x._1, x._2)
The A <% Int
оголошує зв'язаний вигляд, вимагаючи від них імплікаційного перетворення A
до Int
бути доступним в області виклику.
Може здатися, що таке можливо:
implicit def tupleConvert2[A <% B, B, C](x: (A, C)): (B, C) = (x._1, x._2)
що дозволяє конвертувати будь-який 2-тип типу (A, C)
до (B, C)
отримано конверсію з A
до B
. Однак через те, як Scala вирішує параметри типу для імпліцитів, це не працює *.
* (Я думаю, це може бути помилка, вона дуже схожа на SI-2046, що є дублікатом SI-3340, який все ще відкритий)