que estoy tratando de evitar las construcciones de esta manera:ternario Operador similar a:?
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Ok, en este ejemplo el then
y else
rama son simples, pero se puede los complejos de imagen. que construyeron los siguientes:
object TernaryOp {
class Ternary[T](t: T) {
def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
}
class Branch[T](branch: T => Boolean) {
def ?[R] (then: T => R) = new BranchThen(branch,then)
}
class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
class Elze[T,R](elze: T => R) {
def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
}
class BranchThenElse[T,R](val branch: T => Boolean, val then: T => R, val elze: T => R)
implicit def any2Ternary[T](t: T) = new Ternary(t)
implicit def fct2Branch[T](branch: T => Boolean) = new Branch(branch)
implicit def fct2Elze[T,R](elze: T => R) = new Elze(elze)
}
definido que, puedo reemplazar el sencillo ejemplo anterior con:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Pero, ¿cómo puedo deshacerme de la s: String =>
? Quiero algo así:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Supongo que el compilador necesita el material extra para inferir los tipos.
Desde que en realidad no tienen esto en mi respuesta - la razón por la que' Si tienes problemas es que la inferencia de tipo funciona mejor de izquierda a derecha, pero estás uniendo tus tokens de derecha a izquierda debido a la precedencia del operador. Si redactas todas las palabras de tus declaraciones (con la misma precedencia) y cambias la forma en que las cosas se agrupan, obtendrás la inferencia que deseas. (Es decir, tendría las clases 'HasIs',' IsWithCondition', 'ConditionAndTrueCase' que crearían partes de la expresión de izquierda a derecha.) –
Me imaginé inconscientemente el camino de la inferencia de tipo de izquierda a derecha, pero trabada con la precedencia del operador y asociatividad de nombres de métodos, especialmente comenzando con '?' antes que cualquier otro carácter alfanumérico como nombre de método primero char y '' 'para asociatividad izquierda. Así que tengo que replantearme los nuevos nombres de métodos para que la inferencia de tipos funcione de izquierda a derecha. ¡Gracias! –