una superior programacion orden funciones funcional funcion ejemplos scala function-composition

scala - superior - orden de una funcion programacion



Composición de funciones de métodos, funciones y funciones parcialmente aplicadas en Scala (2)

Puedes usar simplemente ''a compose b''.

scala> val c = a compose b c: String => java.lang.String = <function1>

Algo similar a los métodos de redacción de Stack Overflow Compose y luego , he estado trabajando en el tutorial Scala School de Twitter y rápidamente me encontré con el mismo problema que tenía un comentarista (lo cual fue genial, porque me fui a la cama pensando que mi problema estaba resuelto).

En el tutorial, define dos métodos como tales:

def addUmm(x: String) = x + " umm" def addAhem(x: String) = x + " ahem"

y mientras que en las versiones más recientes de Scala, no puede llamar a componerlas como tales: addUmm(_).compose(addAhem(_)) , la respuesta aceptada (y algunas de las otras respuestas parecen depender del hecho de que addUmm y addAhem son métodos, no funciones, lo que crea un problema cuando se trata de llamar a componer. Me fui a la cama satisfecho, habiendo ejecutado con éxito:

scala> ((s: String) => s + " umm").compose((s: String) => s + " ahem") res0: String => java.lang.String = <function1>

Guay. El problema es que, aunque no poder componer los métodos tiene sentido, cuando lo mismo con los valores que conozco evalúo en Function1 :

val a = (s: String) => s + " umm" val b = (s: String) => s + " ahem" val c = a(_).compose(b(_))

Bueno, esa última línea tose el mismo error que la pregunta original, aunque esta vez sean aplicaciones parciales de funciones, no de métodos. Una de las respuestas en la pregunta original (altamente clasificada, pero no aceptada) parece indicar que tiene que ver con la forma en que se expande la aplicación parcial, ¿cuál es la explicación?

Para un novato en Scala, el hecho de que el inferencio obtenga a(_).compose(b(_)) incorrecto sin importar si especificas explícitamente _: String ambos lugares, pero a.compose(b) hace es algo confuso.


a(_).compose(b(_)) expande a x => { a(x).compose(y => b(y) } . Por lo tanto, el error. Lo que desea es (x => a(x)).compose(y => b(y)) . Agregar un par de paréntesis soluciona esto.

scala> (a(_)).compose(b(_: String)) res56: String => java.lang.String = <function1> scala> res56("hello") res57: java.lang.String = helloahemumm

Pero como a y b son funciones, puedes evitar todo este movimiento y simplemente hacer a compose b .