delegati generici (C #) in Scala?

1

Volevo sapere se c'è un equivalente dei delegati generici C # in Scala.

Il sito web di riferimento è: link

Sto cercando di fare un confronto completo tra C # e Scala, sulla (co) (contra) (in) varianza.

    
posta Jolien Neirynck 31.12.2014 - 10:23
fonte

1 risposta

3

Scala non ha delegati, ma sei libero di assegnare funzioni / lambdas alle variabili. Qui si applicano le normali regole di sottotitoli. Una funzione f: A => B è un sottotipo di g: C => D se l'argomento è un supertipo A > C (controvarianza) e il tipo restituito è un sottotipo B < D (controvarianza). Tieni presente che uno qualsiasi di questi quattro tipi potrebbe in realtà essere una tupla, quindi in questi casi verrà applicata la sottotipizzazione della tupla.

Esempio:

// two (sub-)types to demonstrate variance
class A()
class B() extends A

var delegate: Option[B => A] = None

// a few simple lambdas that can be assigned
delegate = Some((b: B) => new A())  // invariant
delegate = Some((b: B) => new B())  // return type covariance
delegate = Some((a: A) => new A())  // argument type contravariance
delegate = Some((a: A) => new B())  // co- and contravariance

// can we assign methods to function types? Yes!
class Context(retVal: A) {
    def meth(b: B): A = retVal
}

val ctx = new Context(new A())
delegate = Some(ctx.meth _)  // partial application
delegate = Some(b => ctx.meth(b)) // wrapping in lambda

Se aggiungiamo (più) generici, questo non cambia nulla poiché le funzioni sono già tipi generici in Scala. In particolare, la co- e controvarianza per le funzioni è disponibile perché le funzioni sono effettivamente definite come trait Function1[-T1, +R] . I tipi definiti dall'utente possono anche fare uso della varianza se definiti correttamente.

    
risposta data 31.12.2014 - 12:00
fonte

Leggi altre domande sui tag