"La OLP ya no podrá salvarnos de los Monstruos de la Nube".
Nota del traductor: Hay dos conceptos: paralelismo (ejecución al mismo tiempo, independientemente) y competitividad (ejecución en pasos, a la vez, pero al mismo tiempo varias tareas), y como siempre, tuve que aplastarme la cabeza eligiendo los términos correctos.
Duplicaré algunas palabras o términos entre paréntesis en el original, para buscar información adicional en términos en inglés, que será muchas veces más.Quizás ya haya escuchado tal expresión, como: "Clojure", "Scala", "Erlang" o incluso "Java ahora tiene lambdas". Y usted tiene, aunque sea una idea lejana de "Programación funcional". Si es miembro de algún tipo de comunidad de programación, entonces este tema ya podría ser discutido por usted.Si busca en Google la frase "Programación funcional", no verá nada nuevo. El segundo idioma de los creados anteriormente ya cubre este tema; fue creado en los años 50 y se llama Lisp. Entonces, ¿qué demonios, este tema se ha vuelto popular en este momento? ¿Solo 60 años después?Al principio, las computadoras eran muy lentas
Lo creas o no, las computadoras fueron las más lentas que las DOM. No realmente. Y al mismo tiempo, había 2 ideas principales en el acuerdo sobre el diseño y la implementación de lenguajes de programación:Las computadoras no tenían suficiente potencia informática para hacer frente a todas las abstracciones y hacer frente a los programas escritos en un estilo funcional. Entonces Lisp estaba agotado antes, siendo extremadamente lento y, por lo tanto, no apto para el trabajo. Fue entonces cuando comenzó el dominio del imperativo estilo de programación, especialmente con el apogeo de C.Pero las computadoras han mejorado mucho.
Ahora se ha vuelto casi normal usar la mayoría de las aplicaciones, sin importarles en qué idioma se escribieron. Los lenguajes funcionales finalmente tuvieron una segunda oportunidad.Programación funcional 50.5
Este artículo no es una introducción a FI. Al final de esta sección, necesitará saber qué es la FA y cómo comenzar su viaje de estudio.Puede entender el término "Programación funcional" demasiado literalmente como programación usando funciones y esto no está lejos de la verdad. Creará funciones en términos de otras funciones y funciones de escritura (¿Recuerda f ∘ g del currículo escolar? Ahora será útil). Es todoLa lista (no completa) de características de FP:- Funciones de primera clase
- Funciones de alto orden
- Funciones puras
- Cierres
- Estado inmutable
Ahora no tiene que preocuparse por estos términos extraños, solo entienda lo que significan.Las funciones de la primera clase significan que puede guardar funciones en variables. Estoy seguro de que hiciste algo similar, como en el ejemplo de JavaScript:var add = function(a, b){
return a + b
}
Acaba de crear una función anónima que obtiene a y b y devuelve a + b , y asigna esta función a la variable de agregar .Las funciones de orden superior significan que las funciones pueden devolver funciones o aceptar funciones como parámetros.Y nuevamente en JavaScript:document.querySelector('#button')
.addEventListener('click', function(){
alert('yay, i got clicked')
})
ovar add = function(a){
return function(b){
return a + b
}
}
var add2 = add(2)
add2(3)
Ambas opciones son un ejemplo de funciones de orden superior, incluso si no escribió algo como esto, es posible que haya visto algo similar en otro lugar.Funciones puras significa que la función no cambia las variables, simplemente acepta los datos y los devuelve, como nuestras funciones favoritas de las matemáticas. Esto también significa que si llama a la función f con el argumento 2 y devuelve 10 , siempre devolverá 10 . No importa qué entorno, número de hilos u orden de ejecución. No causan ningún efecto secundario en otras partes del programa y este es un concepto realmente poderoso.Corto circuitos significa que puede guardar algunos datos dentro de la función que estarán disponibles en una función de retorno específica, en otras palabras, la función de retorno almacena su tiempo de ejecución.var add = function(a){
return function(b){
return a + b
}
}
var add2 = add(2)
add2(3)
Mire nuevamente el segundo ejemplo del párrafo Funciones de un orden superior , la variable a se cerró y solo está disponible en la función devuelta. De hecho, los cierres no son una característica del paradigma FP, sino más bien la optimización.Un estado inmutable significa que no puede cambiar ningún estado (aunque puede crear otros nuevos). En el siguiente código (en OCaml), se establece la variable x a 5 y x siempre será 5 .let x = 5;;
x = 6;;
print_int x;;
Estas características se ven lo suficientemente extrañas, pero pronto verá cómo le hacen la vida más fácil.La programación orientada a objetos ya no puede protegerlo
Este es un momento prometedor cuando finalmente podemos tener aplicaciones distribuidas y de subprocesos múltiples. Desafortunadamente, nuestro modelo existente (o el más utilizado) no está listo para la concurrencia y el paralelismo, aunque resuelve los problemas actuales, pero también agrega grandes problemas.Para mejorar las aplicaciones, necesitamos una forma simple y confiable de lograr lo que queremos. ¿Recuerdas las características de AF mencionadas anteriormente? ¿Funciones puras y estado inmutable? Así es, puede realizar funciones miles de veces en diferentes núcleos o máquinas y el resultado siempre será el mismo. Y así, podemos ejecutar el mismo código en el mismo núcleo y en miles. La vida nuevamente se vuelve sin nubes."Pero, ¿por qué no puedo seguir usando OOP?"
Al menos para multihilo y paralelismo, OOP ya no puede ayudarlo. Porque OOP se refiere a un estado con un estado mutable (en lenguajes imperativos que se escriben en estilo OOP, en la mayoría de los casos). Se supone que los métodos llamados del objeto cambian el yo actual o esto . Tendrá que hacer un esfuerzo suficiente para actualizar y sincronizar correctamente todos los hilos.Escribo esto para no agitarlo a cambiar a FP de los paradigmas que está utilizando actualmente (aunque algunas personas dirán que debería hacerlo), pero definitivamente debe entender: Java y C ++ 11 ya tienen cálculo lambda. Puedo decir que casi todos los lenguajes modernos y compatibles implementarán funciones FP o ya lo han hecho.Vale la pena señalar que no debemos dejar de usar el estado mutable. Debemos usar entrada / salida (IO), etc., para que nuestros programas sean útiles. La idea principal de FP es: usar un estado mutable solo cuando sea realmente necesario."No trabajo con nubes, ¿realmente necesito estudiar AF?"
Si.La programación funcional lo ayudará a escribir mejor los programas y a hablar sobre los problemas que tiene que resolver."Yo he tratado. Es un código demasiado complicado y difícil de leer ".
Comenzar siempre es difícil en cualquier campo. Estoy seguro de que comenzaste a aprender programación también teniendo un montón de problemas, incluso en lenguajes OOP. Quizás comenzar a escribir en el estilo OOP fue más fácil que escribir su primer programa porque ya estaba familiarizado con algunos modismos comunes, como declarar variables y bucles for / while.Comenzar a aprender FP es casi lo mismo que comenzar a escribir programas desde cero nuevamente (no importa qué idioma haya comenzado a aprender, no será ambiguo cómo comenzar desde el principio).Muchos pueden notar que la FA es difícil de leer. Si tiene experiencia en lenguajes imperativos, los programas funcionales se verán como criptografía. Y no porque realmente lo sea, sino porque no conoces sus modismos principales. Una vez que hayan comprendido los principios fundamentales, los programas serán mucho más legibles.Echa un vistazo al programa escrito en Haskell y JavaScript (estilo imperativo):guess :: Int -> [Char]
guess 7 = "Much 7 very wow."
guess x = "Ooops, try again."
function guess(x){
if(x == 7){
return "Much 7 very wow."
}
else {
return "Oops, try again."
}
}
Este es un programa muy sencillo. Muestra un mensaje de felicitación cuando el usuario adivinó e ingresó el número 7 o muestra un mensaje de error en todos los demás casos. Quizás esto parezca cifrado, ya que Haskell puede hacer todo el trabajo en solo dos líneas de código (puede ignorar la primera línea, es solo una "declaración de tipo"). Pero será bastante simple, una vez, haber entendido las posibilidades de coincidencia de patrones (que se implementan no solo en lenguajes FP, sino que también fueron su característica).Qué hace Haskell:si el argumento aceptado para adivinar es 7, entonces arrojará "Mucho 7 muy wow". o devolverá "Oooops, inténtalo de nuevo". en otros casos.Y esto es lo mismo que hace el código JavaScript, pero Haskell se asigna al "patrón" declarado por el programador en el código.Este enfoque puede no parecer muy útil en este caso, si puede usar if / else. Pero será realmente útil cuando usted mismo comience a escribir estructuras de datos más complejas.plus1 :: [Int] -> [Int]
plus1 [] = []
plus1 (x:xs) = x + 1 : plus1 xs
En el programa anterior, * plus1 * es una función que toma una lista de enteros y agrega 1 a cada elemento de la lista. La función se compara cuando la lista está vacía [] (devuelve otra lista vacía, ya que no hay elementos en ella) omite la lista no vacía y define un patrón de coincidencia: x como primer elemento de la lista, xs como la lista restante. Luego, simplemente calcula la suma y la combina a través de una llamada recursiva.Estoy seguro de que pasará muchos minutos (no el más agradable), reescribiendo este ejemplo en un estilo imperativo, ajustando el código en dos líneas, manteniendo la legibilidad.Entonces empecemos
Se ha publicado una gran cantidad de material sobre programación funcional, pero no debe omitir estos enlaces sin ambigüedades:- Principios de programación funcional en Scala : el curso será útil para aquellos que conocen Java y quieren probar la programación funcional sin saltar de la JVM. El curso cubre conceptos básicos.
- Paradigmas de programación de computadoras - Fundamentos : este curso será útil para aquellos que quieran aprender a escribir programas en un lenguaje funcional. El curso utiliza el lenguaje de aprendizaje Qz. Hay muchos ejercicios en el curso, puede usar un lenguaje funcional e intentar crear su propia estructura de datos. Creo que el curso proporciona bloques de construcción para el "edificio" llamado "Programación funcional", lo ayudará con otros idiomas en el futuro.
Desafortunadamente, los cursos solo estarán disponibles al final del año. Pero puede seguir el contenido y los videos, están disponibles en Youtube.Por otro lado, si prefiere materiales de texto, ciertamente recomiendo algunos de ellos:- Estructura e interpretación de programas de computadora
- Cómo diseñar programas
- Conceptos, técnicas y modelos de programación informática.
Los dos primeros tienen un plan de estudios similar, te presentan las bases de la programación funcional y son muy adecuados para principiantes. El tercero de los enlaces, este curso en Paradigmas de programación de computadoras, cubre más que la Programación funcional. Es importante tener en cuenta que estos materiales son para principiantes.Además, Chris Allen escribió un excelente artículo sobre el estudio de la programación funcional. Se llama Educación Funcional.y tiene una lista exhaustiva de materiales para estudiar la programación funcional con Haskell, además de hablar sobre las fortalezas y debilidades de este enfoque. Siguiendo los enlaces recomendados por Chris, puede aprender los principios básicos y los temas más complejos (estoy seguro de que ha oído hablar de las mónadas) de la programación funcional y tal vez sepa cómo escribir aplicaciones con ellos. (Gracias Chris por los enlaces a los materiales.) ¡Buena suerte con su Año Nuevo Funcional! ☺