#82 depende de a qué te refieras con "ese tipo de lenguajes." Con respecto a lenguajes puramente funcionales no creo que haya muchas grandes implementaciones. Casos semi-híbridos como LISP seguramente haya alguno y, si no, se usan para pequeños bloques donde convenga. En lenguajes híbridos completos (véase Scala) hay mil y un grandes desarrollos (no olvidemos que Scala va sobre una plataforma consolidada como la JVM.)
Si Scala entra dentro de la definición, Twitter, LikedIn y otros tantos lo usan. Twitter de hecho migró porque con Ruby les petaba seriously.
Lo bueno de los lenguajes funcionales es que ESCALAN y creo que en el momento que vivimos que es web masiva es muy importante. Escalan en ambos sentidos: en código (es fácil hacer "crecer" el código sobre tu base actual por lo que comento de los bloquecitos) y en ejecución.
A un lenguaje funcional le da igual 8 que 80, nunca mejor dicho. Se comportan igual y no tienes que tener el cuenta casos especiales. El rendimiento que pierdes es directamente proporcional a la complejidad de tu algoritmo mientras que en lenguajes imperativos la cosa se complica tanto que influyen miles de factores no inherentes a la solución del problema.
Además, en un lenguaje funcional la filosofía es que no hay estados mutables: tú tienes funciones que reciben parámetros y devuelven cosas. FIN. ¿Qué significa esto? Que un cálculo que dura 1 minuto lo puedo distribuir en mil máquinas y mil de esos cálculos duran un minuto. ¿Te imaginas hacer lo mismo en un lenguaje que use estado mutable? MUERTE. Tienes que andar sincronizando y pasando mierda para acá y para allá, y cuando más grande más mierda tienes que pasar y por tanto peor rendimiento (en resumen: no escalan.)
Y es que encima ES FÁCIL DE PROGRAMAR. A mí me parece más intuitivo que el factorial de un número es la múltiplicación de todos los números desde 2 hasta él. ¡Es obvio! Y en Scala así se escribe:
(2 to n) reduce(_*_)
¡Si es que lo puedes hasta leer! Desde 1 hasta n, multiplícalos. Ni más ni menos. ¿Cómo haces lo mismo en imperativo? Bucles, contadores y demás mierdas que NADA tienen que ver con el problema de fondo. Los lenguajes imperativos sólo complican.
¿Que resulta que ahora quiero factoriales gigantescos? No problemo, uso BigInt.
(BigInt(2) to BigInt(n)) reduce(_*_)
Inmejorable, ¿verdad? Pues no. Cuando ejecutas eso, se crea una lista en memoria de n elementos. Yo quiero que se vaya calculando par a par. ¿Cómo lo consigo? Con streams:
Stream range(BigInt(2), BigInt(n+1)) reduce(_*_)
Sigue pudiéndose leer literalmente: un stream de un rango entre 1 y n+1 (aquí es n+1 porque el rango es exclusivo) que es reducido en base a multiplicar sus elementos. ¿Alguien da más?
Uy, que resulta que ahora le quiero añadir soporte multicore. ¿Cómo lo haces en un lenguaje imperativo? No me lo quiero ni imaginar... pero flipa en Scala cómo se hace:
Stream.range(BigInt(2), BigInt(n+1)).par.reduce(_*_)
¡Sólo le he añadido par! ¿Es o no es para flipar?
A eso me refiero con los pequeños "bloquecitos". Todo esto que he usado viene en la librería estándar de Scala, pero es que lo que no viene lo puedo hacer yo y usar esos nuevos bloquecitos. No sólo eso, Scala además ayuda a que los nuevos constructos que vas creando se integren en el lenguaje de forma transparente.
Por ejemplo, me voy a definir un bloque de control que, todo lo que ejecute dentro, mida el tiempo que tarda en ejecutarse:
def time(f: => Unit) = {
val s = System.nanoTime
f
System.nanoTime - s
}
In your face! Así de simple. Ahora cuando quiero medir el tiempo de algo sólo tengo que hacer:
time {
instrucción_1
instrucción_2
instrucción_3
}
Igual que una puta estructura de control del lenguaje. IN-ME-JO-RA-BLE
Yo creo que si no se usan en grandes desarrollos es porque la peña sólo sabe pensar en Java, que es un lenguaje CUADRICULADO y pensado para las empresas. Tiene cuatro cosas contadas, por lo que modelar para Java es "easy as pie". Modelar para Scala no es tan fácil...
De ahí que la gente ni se complique. Es una mezcla entre medio empresarial (¿cosas nuevas? ¿estás loco?), desconocimiento del personal (¿cosas nuevas? ¿estás loco?) y estandarización (¿y esto como lo hago en UML?)
#83 yo por suerte en mi carrera tengo un par de profesores que son unos frikazos matemáticos así que el rollo algorítmico y funcional no me es desconocido. Además he tocado en 3 asignaturas movidas funcionales y en otras tantas algoritmia. Aún así, como oip yo también me lo he mirado por mi cuenta que es como se aprende de verdad.
De libros sobre algoritmia... pues no sabría decirte. ¿Wikipedia? ¿Google?
Sobre funcional "Progamming in Scala", del propio autor de Scala (Martin Odersky) Fácil, simple y para toda la familia. Literalmente, es MUY fácil de entender. No he encontrado un libro así de bien redactado en mi vida. En inglés, eso sí... Lo malo es que mientras que te enseña a "pensar en funcional" también te enseña Scala, que es un lenguaje con muchos "recovecos" así que acabas perdido entre Scala funcional y tal...
Lo mejor para aprender es mancharte los dedos. Bájate cualquier intérprete de Common LISP, el IDE oficial de Scala y a toquetear.