Подтвердить что ты не робот

Не могу понять, что =: = [A, B] означает

Возможный дубликат:
Что делать <: <, <% <, и =: = среднее значение в Scala 2.8 и где они документированы?

Я не понимаю, что означает =: = [A, B] и как это может быть полезно. Я провел некоторое исследование, но трудно найти что-то, в котором нет букв алфавита. Может ли кто-нибудь помочь мне с реальным примером?

4b9b3361

Ответ 1

Начиная с Scala 2.8, параметризованные типы с параметрами имеют еще более ограниченные возможности через классы ограничения обобщенного типа. Эти классы предоставляют дополнительную специализацию в методах и дополняют границы контекста следующим образом:

A =: = B утверждает, что A и B должны быть равными

A < B утверждает, что A должен быть подтипом B

Пример использования этих классов будет заключаться в том, чтобы включить специализацию для добавления числовых элементов в коллекции или для форматирования печати на заказ или для расчета индивидуальных обязательств по конкретным типам ставок или фондов в портфеле трейдеров. Например:

case class PrintFormatter[T](item : T) {
def formatString(implicit evidence: T =:= String) = { // Will only work for String PrintFormatters
     println("STRING specialised printformatting...")
}
    def formatPrimitive(implicit evidence: T <:< AnyVal) = { // Will only work for Primitive PrintFormatters
println("WRAPPED PRIMITIVE specialised printformatting...")
}
}

val stringPrintFormatter = PrintFormatter("String to format...")
stringPrintFormatter formatString
// stringPrintFormatter formatPrimitive // Will not compile due to type mismatch

val intPrintFormatter = PrintFormatter(123)
intPrintFormatter formatPrimitive
// intPrintFormatter formatString // Will not compile due to type mismatch

Здесь вы можете найти полный короткий курс о типах Scala: http://scalabound.org/?p=323

Ответ 2

Класс =:=[A,B] является доказательством того, что A и B относятся к одному классу. См. http://apocalisp.wordpress.com/2010/06/10/type-level-programming-in-scala-part-2-implicitly-and/ для объяснения.

Очень трудно найти несколько примеров. Вот немного кода:

Ответ 3

Лучшее, что нужно выяснить, это посмотреть на источник Predef. Там вы найдете следующее:

object =:= {
  implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x}
}

Таким образом, объект типа A =: = B доступен только неявно, если A и B являются одним и тем же типом.