2011-06-21 22 views
12

Eventuali duplicati:
What do <:<, <%<, and =:= mean in Scala 2.8, and where are they documented?non riesce a capire che cosa =: = [A, B] sta per

Non capisco quello che la =: = [A, B] sta per e come può essere utile. Ho fatto qualche ricerca ma è difficile cercare qualcosa che non abbia caratteri alfanumerici. Qualcuno può aiutarmi con un esempio reale?

+1

Ci scusiamo per la duplicazione, ma ancora una volta, non è possibile cercare la stringa "=: =" ... – paradigmatic

risposta

11

da Scala 2.8 tipi parametrizzati in poi sono state offerto funzionalità ancora più vincolo tramite classi di vincolo tipo generalizzato. Queste classi consentono ulteriore specializzazione nei metodi, e complementare limiti contesto, come segue:

A =: = B asserisce che A e B devono essere uguali

A <: < B asserisce che A deve essere un sottotipo di B

Un esempio di utilizzo di queste classi è l'abilitazione di una specializzazione per l'aggiunta di elementi numerici in una raccolta o per la formattazione di stampa personalizzata o per consentire calcoli di responsabilità personalizzati su tipi specifici di scommessa o fondo in un portafoglio di operatori . Per esempio:

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 

è possibile trovare un intero corso breve di tipi Scala qui: http://scalabound.org/?p=323

+1

Com'è '<: <' diverso da ':' allora? – ninjagecko

+2

@ninjagecko: 'a: A' asserisce che il _term_' a' ha il _type_ 'A' ... è analogo alla relazione" è un elemento di "(a ∈ A) nella teoria degli insiemi. 'A <:

4

La classe =:=[A,B] è la prova per A e B appartenente alla stessa classe. Vedi per es. http://apocalisp.wordpress.com/2010/06/10/type-level-programming-in-scala-part-2-implicitly-and/ per una spiegazione.

È davvero difficile trovare alcuni esempi. Ecco un po 'di codice po':

+2

Puoi fare un esempio su come usarlo, per favore? – ziggystar

0

La cosa migliore per scoprire è quello di esaminare la fonte di Predef. Ci si trova questo:

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

Così un oggetto di tipo A =: = B è disponibile solo in modo implicito se A e B sono dello stesso tipo.

+0

Ma questo è un oggetto che * usa * la classe '=: = [A, A]'. Non spiega cosa significa 'A =: = A'. – Debilski

+0

Ti dice come il compilatore può ottenere implicitamente un'istanza di A =: = B, che è l'unica cosa per cui la classe è usata. La classe _only_ funge da testimone del fatto che A è uguale a B. –

Problemi correlati