2011-09-27 21 views
7

ho creato seguente frammento:Tipo inferenza da destra a sinistra codice

class PimpToRight[A](f: A => Boolean) { 
    def <| (a: A) = f(a) 
} 
implicit def f2pimp[A](f: A => Boolean) = new PimpToRight(f) 

class PimpToLeft[A](a: A) { 
    def <|: (f: A => Boolean) = f(a) 
    def |> (f: A => Boolean) = f(a) 
} 
implicit def a2pimp[A](a: A) = new PimpToLeft(a) 

ci sono metodi destro e sinistro-associativa disponibili. Codice

seguenti lavori:

((_: Int) > 3) <| 7 
((_: Int) > 3) <|: 7 
7 |> (_ > 3) 

Ma questo non lo fa:

(_ > 3) <| 7 
(_ > 3) <|: 7 

E 'possibile dedurre parametri di tipo da destra a sinistra?

+2

Sono sorpreso che ci sia una differenza tra, '(_> 3) <|: 7' e' 7. \ '<|:\'(_ > 3)', ma in effetti solo quest'ultimo compila. Se non si ottiene una risposta qui, forse chiedere sulla mailing list o controllare il bug tracker? –

+0

@Kipton nota che è possibile omettere i tick posteriori se si pone il '7' tra parentesi in questo modo:' (7). <|:(_ > 3) ', dal momento che il compilatore tenta di invocare' <|: 'su un' Double' '7.' senza la parentesi, che a sua volta conduce a un'invocazione infissa di' <|: 'e che riconduce al tipo problema di inferenza. – agilesteel

risposta

5

Questi due problemi sono correlati: SI-4773 e SI-1980. Sulla base di questi problemi, la risposta alla tua domanda sembra essere no. Sebbene non sia direttamente correlato alla tua domanda, c'è un post molto bello di Paul Chiusano su making the most of type inference in Scala, che indirizza lo stato corrente dell'inferenza di tipo in Scala e fornisce alcuni consigli utili.

Problemi correlati