2011-06-21 28 views

Respuesta

11

De Scala 2.8 en adelante tipos parametrizados se ha concedido aún más las capacidades de restricciones a través de clases de restricción de tipo generalizado. Estas clases permiten una mayor especialización en los métodos, y se complementan fuera de contexto, como sigue:

A =: = B afirma que A y B deben ser el igual

A <: < B afirma que A debe ser un subtipo de B

Un ejemplo de uso de estas clases sería habilitar una especialización para agregar elementos numéricos en una colección, o para el formato de impresión a medida, o para permitir cálculos de responsabilidad personalizada en tipos específicos de apuestas o fondos en una cartera de traders . Por ejemplo:

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 

se puede encontrar una breve curso entero sobre los tipos de Scala aquí: http://scalabound.org/?p=323

+1

¿Cómo es '<: <' diferente de ':' entonces? – ninjagecko

+2

@ninjagecko: 'a: A' afirma que _term_' a' tiene _type_ 'A' ... es análoga a la relación" es un elemento de "(a ∈ A) ... en la teoría de conjuntos. 'A <:

4

La clase =:=[A,B] es evidencia de que A y B son de la misma clase. Ver p. http://apocalisp.wordpress.com/2010/06/10/type-level-programming-in-scala-part-2-implicitly-and/ para una explicación.

Es realmente difícil encontrar algunos ejemplos. Aquí es un poco de código de bits:

+2

¿Puede dar un ejemplo de cómo usarlo, por favor? – ziggystar

0

Lo mejor para averiguar es mirar a la fuente de Predef. Allí se encuentra la siguiente:

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

lo tanto un objeto de tipo A =: = B sólo está disponible implícitamente, si A y B son del mismo tipo.

+0

Pero ese es un objeto que * usa * la clase '=: = [A, A]'. No explica qué significa 'A =: = A'. – Debilski

+0

Le indica cómo el compilador puede obtener implícitamente una instancia de A =: = B, que es la única para la que se utiliza la clase. La clase _only_ actúa como testigo del hecho de que A es igual a B. –

Cuestiones relacionadas