estoy siguiendo el tutorial Pattern matching & functional composition sobre el Scala compose
y andThen
métodos. Hay un ejemplo:componer y andthen métodos
scala> def addUmm(x: String) = x + " umm"
scala> def addAhem(x: String) = x + " ahem"
val ummThenAhem = addAhem(_).compose(addUmm(_))
Cuando trato de usarlo me sale un error:
<console>:7: error: missing parameter type for expanded function ((x$1) => addAhem(x$1).compose(((x$2) => addUmm(x$2))))
val ummThenAhem = addAhem(_).compose(addUmm(_))
^
<console>:7: error: missing parameter type for expanded function ((x$2) => addUmm(x$2))
val ummThenAhem = addAhem(_).compose(addUmm(_))
^
<console>:7: error: type mismatch;
found : java.lang.String
required: Int
val ummThenAhem = addAhem(_).compose(addUmm(_))
Sin embargo, esto funciona:
val ummThenAhem = addAhem _ compose addUmm _
o incluso
val ummThenAhem = addAhem _ compose addUmm
¿Qué pasa con el código en el tutorial? ¿No es la última expresión la misma que la primera sin paréntesis?
Por el bien de la integridad, el ejemplo andthen se parece a:.. 'val ahemThenUmm = addAhem (_) andthen (addUmm (_))' cuando debería parecerse a 'val ahemThenUmm1 = (addAhem _) andthen (addUmm) ' –
No estoy tan seguro de la parte escrita entre corchetes; el compilador * no * convierte el método para que funcione automáticamente, al menos para Scala 2.10.2. La solución es declarar 'addAhem' y' addUmm' como funciones para que 'compose' o' andThen' funcione sin '_'. –