ventajas programacion perezosa funciones funcional evaluacion ejemplos desventajas java python scala haskell functional-programming

java - programacion - ¿Es Scala un lenguaje de programación funcional?



programacion funcional ventajas y desventajas (3)

Aprendí programación de Java, luego traté de aprender un lenguaje de programación por año, segundo fue C ++ y luego Python. Vine a aprender la siguiente, busqué algo nuevo, elegí Scala porque era compatible con Java y podría ser una transición de OOP a Programación Funcional.

Fue genial, aprendiendo nuevos paradigmas, nuevo estilo y nueva forma de pensar. Fue una gran experiencia solo leer acerca de los conceptos elegantes de Scala y mucho mejor codificar en Scala.

Leyendo muchos artículos me enfrenté a this artículo criticando a Scala:

Scala no es un lenguaje de programación funcional. Es un lenguaje orientado a objetos estáticamente tipado con cierres.

Después de leer estos artículos, me surgieron algunas dudas, realmente me gusta Scala y estaba empezando a escribir más en Scala, pero ¿Scala se adapta a la definición de Programación Funcional? ¿Es ese artículo dice la verdad o simplemente falsos lectores? ¿Debo aprender Haskell o algún otro lenguaje de programación funcional para experimentar realmente la PF?

ACTUALIZACIÓN : Esperando respuestas racionales con buenos ejemplos, sin causar disputas.



Mi prueba de fuego personal para un lenguaje funcional son los números de la Iglesia.

Ejemplo de esquema:

(define (thrice f) (lambda (x) (f (f (f x)))))) ((thrice 1+) 0) => 3

( 1+ es una función de esquema que agrega 1 a su argumento. thrice toma una función f y devuelve una función que compone f consigo misma tres veces. Así que (thrice 1+) agrega tres a su argumento).

((thrice (thrice 1+)) 0) => 9

(Dado que (thrice 1+) es una función que agrega tres, tomar el thrice de eso da una función que agrega nueve).

Y mi favorito:

(((thrice thrice) 1+) 0) => 27

(El razonamiento se deja como un ejercicio para el lector. Este último ejemplo es el más importante).

Si no puede escribir este ejemplo en su idioma sin contorsiones horribles, entonces le digo que no es un lenguaje funcional (ejemplo: C / C ++).

Si puede escribir este ejemplo en su idioma, pero parece muy poco natural, entonces digo que su idioma "admite la programación funcional" pero en realidad no es un lenguaje funcional (ejemplo: Perl).

Si este ejemplo se adapta perfectamente a su idioma y en realidad no es muy diferente de cómo lo usa a diario, entonces es un lenguaje funcional.

No conozco a Scala. ¿Alguien quiere decirme dónde encaja? :-)


Scala no te obliga a escribir en un estilo funcional. Esto es perfectamente válido Scala:

var i = 1 while (i < 10) { println("I like side effects, this is number "+i) i += 1 } case class C(var i: Int, var set: Boolean = false) def setMe(c: C) = { if (!c.set) { c.set = true; c.i += 1 }; c } setMe(C(5))

Así que, en este sentido, ¡horrores, Scala no es funcional! Efectos secundarios en abundancia, estado mutable: todo lo que puede hacer en Java que puede hacer en Scala.

No obstante, Scala le permite codificar en estilo funcional y le facilita la vida (que en Java) de varias maneras:

  • Hay funciones de primera clase.
  • Hay una biblioteca de colecciones inmutables.
  • Se admite la recursión de cola (en la medida en que la JVM puede gestionar)
  • Se admite la coincidencia de patrones
  • (etc.)

Esto parece algo más funcional:

for (i <- 1 to 10) println("Sometimes side effects are a necessary evil; this is number"+i) case class C(i: Int, set: Boolean = false) def setIt(c: C, f: Int=>Int) = C(f(c.i), true) setIt(C(5), _+1)

Vale la pena señalar que el autor de ese artículo en particular parece entender muy poco a Scala; casi todos los ejemplos que se ven feos en sus manos son innecesariamente feos. Por ejemplo, escribe.

def x(a: Int, b: Int) = a + b def y = Function.curried(x _)(1)

Pero no es tan malo, si prestas atención a lo que estás haciendo:

def x(a: Int)(b: Int) = a + b val y = x(1) _

De todos modos, la conclusión es que Scala no es un lenguaje de programación funcional puro, y como tal, su sintaxis no siempre es ideal para la programación funcional, ya que hay otras consideraciones en juego. Sin embargo, tiene prácticamente todas las características estándar que uno espera de un lenguaje de programación funcional.