Puedo usar el operador scalaz
|>
cuando quiero cambiar la función y el objeto para que se pueda adquirir un poco más de legibilidad. Permítanme presentarles una función de modelo: cambiar la función y el objeto con scalaz '|>
def length2(x:String) = x.length * 2
Ahora, puedo escribirlo en ambos sentidos:
"aoeu" |> length2
length2("aoeu")
Pero si defino esta función más genérica, deja de funcionar.
def length2(x:SeqLike[_
,_
]) = x.length * 2
length2("aoeu") // ok
"aoeu" |> length2 // doesn't work
¿Por qué el compilador no entiende esto? Definitivamente hay una conversión implícita de
String
a alguna clase de mezcla en el rasgo
SeqLike
.
Tricky. Al principio pensé que era porque solo puedes tener uno implícito a la vez, pero ahora parece que también es un problema de varianza escondido en alguna parte ... – Debilski
@Debilski, no estoy seguro de dónde '|>' está definido en scalaz, pero cuando Traté de definir el mío, creo que la "única regla implícita" es lo que impidió su aplicación: "aoeu" necesitaría ser convertido implícitamente a la clase con el método '|>' y luego nuevamente a 'SeqLike'. – huynhjl
Muestra el mensaje de error. No todos tienen Scalaz disponible, pero los mensajes de error generalmente explican lo que está pasando mal. –