2011-09-27 14 views
7

he creado siguiente fragmento:La inferencia de tipos de derecha a izquierda código

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) 

hay métodos derecha e izquierda asociativo disponibles.

siguiente código funciona:

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

Pero esto no es así:

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

¿Es posible inferir los parámetros de tipo de derecha a izquierda?

+2

Me sorprende que haya una diferencia entre '(_> 3) <|: 7' y' 7. \ '<|:\'(_ > 3)', pero de hecho solo este último compila. Si no obtiene una respuesta aquí, tal vez pregunte en la lista de correo o verifique el rastreador de errores. –

+0

@Kipton tenga en cuenta que puede omitir las marcas de retroceso si coloca el '7' entre paréntesis como este:' (7). <|:(_ > 3) ', ya que el compilador intenta invocar' <|: 'en un' Doble'' 7.' sin el paréntesis, que a su vez conduce a una invocación infija de '<|:' y eso nos lleva de vuelta al tipo problema de inferencia – agilesteel

Respuesta

5

Estos dos problemas están relacionados: SI-4773 y SI-1980. En función de estos problemas, la respuesta a su pregunta parece ser no. Si bien no está directamente relacionado con su pregunta, hay una publicación muy buena de Paul Chiusano en making the most of type inference in Scala, que aborda el estado actual de la inferencia de tipo en Scala y proporciona algunos consejos útiles.

Cuestiones relacionadas