El caso de estilo libre de puntos en Scala
functional-programming pointfree (4)
En pocas palabras, se trata de poder evitar especificar un nombre donde no se necesita ninguno, considere un ejemplo trivial:
List("a","b","c") foreach println
En este caso, foreach
está buscando aceptar String => Unit
, una función que acepta un String y devuelve Unit (esencialmente, que no hay retorno utilizable y funciona únicamente a través de un efecto secundario)
No es necesario vincular un nombre aquí a cada instancia de String que se pasa a println
. Podría decirse que simplemente hace que el código sea más detallado para hacerlo:
List("a","b","c") foreach {println(_)}
O incluso
List("a","b","c") foreach {s => println(s)}
Personalmente, cuando veo un código que no está escrito en un estilo sin puntos, lo tomo como un indicador de que el nombre del límite puede usarse dos veces, o que tiene algún significado para documentar el código. Del mismo modo, veo el estilo sin puntos como una señal de que puedo razonar sobre el código de manera más simple.
Esto puede parecer realmente obvio para los expertos en FP aquí, pero ¿para qué es bueno el estilo sin puntos en Scala? Lo que realmente me vendería sobre el tema es una ilustración que muestra cómo el estilo sin puntos es significativamente mejor en alguna dimensión (por ejemplo, rendimiento, elegancia, extensibilidad, capacidad de mantenimiento) que el código que resuelve el mismo problema en un estilo sin puntos.
La sintaxis sin puntos de Scala es parte de los operadores mágicos de Scala que son funciones realmente. Incluso los operadores más básicos son funciones:
Por ejemplo:
val x = 1
val y = x + 1
...es lo mismo que...
val x = 1
val y = x.+(1)
... pero, por supuesto, el estilo sin puntos se lee de forma más natural (el signo más parece ser un operador).
No veo otra ventaja que la "elegancia": es un poco más corto y puede ser más legible. Permite razonar acerca de las funciones como entidades, sin ir mentalmente a un "nivel más profundo" para la aplicación de la función, pero, por supuesto, primero es necesario acostumbrarse a ella.
No conozco ningún ejemplo en el que el rendimiento mejore al usarlo (tal vez empeore en los casos en los que terminas con una función en la que un método sería suficiente).
Un atractivo del estilo sin puntos en general es que sin un montón de "puntos" (valores en lugar de funciones) flotando alrededor, lo que debe repetirse en varios lugares para pasarlos a través del cálculo, hay menos oportunidades para cometer un error , por ejemplo, al escribir el nombre de una variable.
Sin embargo, las ventajas de la ausencia de puntos se contrarrestan rápidamente en Scala por su escasa capacidad para inferir tipos, un hecho que se ve agravado por el código sin puntos porque los "puntos" sirven como claves para el inferente tipo. En Haskell, con su inferencia de tipo casi completa, esto no suele ser un problema.