Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Haskell
Wiki community
Recent changes
Random page
HaskellWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Es/Por que Haskell importa
(section)
Page
Discussion
English
Read
Edit
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==驴Qu茅 son los lenguajes de programaci贸n funcionales?== Los lenguajes de programaci贸n como C/C++/Java/Python se llaman imperativos porque consisten en una secuencia de acciones. El programador expl铆citamente le dice a la computadora c贸mo realizar una tarea, paso a paso. Los lenguajes de programaci贸n funcionales trabajan de forma diferente. En lugar de realizar acciones en secuencia, eval煤an expresiones. === El nivel de Abstracci贸n === Hay dos 谩reas que son fundamentales al programar una computadora - manejo de recursos y secuenciaci贸n. El manejo de recursos (alojar registros y memoria) ha sido objeto de mucha abstracci贸n: la mayor铆a de los lenguajes nuevos (imperativos y funcionales) han implementado recolecci贸n de basura para eliminar el manejo de recursos del problema, dejando al programador concentrarse en el algoritmo en lugar de la tarea mec谩nica del alojamiento de memoria. La secuenciaci贸n tambi茅n tuvo algo de abstracci贸n, aunque no al mismo nivel. Los lenguajes imperativos lo han hecho introduciendo nuevas palabras claves y librer铆as est谩ndar. Por ejemplo, la mayor铆a de los lenguajes imperativos tienen sintaxis especial para construir varios bucles ligeramente diferentes, ya no tienes que hacer todas las tareas de manejar estos bucles t煤 mismo. Pero los lenguajes imperativos est谩n basados en la noci贸n de secuenciaci贸n - no pueden escapar de ella completamente. La 煤nica forma de elevar el nivel de abstracci贸n en el 谩rea de secuenciaci贸n para un lenguaje imperativo es introduciendo m谩s palabras clave o funciones est谩ndar, abarrotando el lenguaje. Esta relaci贸n cercana entre lenguajes imperativos y la tarea de secuenciar comandos para que el procesador ejecute significa que los lenguajes imperativos nunca pod艜an elevarse m谩s all谩 de la tarea de secuenciar, y como tales nunca pueden llegar al mismo nivel de abstracci贸n que los lenguajes funcionales. En Haskell, la secuenciaci贸n es eliminada. S贸lo se preocupa por lo que el programa calcula, no cu谩ndo o c贸mo se calcula. Esto hace de Haskell un lenguaje m谩s flexible y f谩cil de usar. Haskell tiende a ser parte de la soluci贸n a un problema, y no parte del problema en s铆. === Funciones y Efectos Laterales en Lenguajes Funcionales === Las funciones tienen un rol importante en los lenguajes de programaci贸n funcional. Las funciones se consideran valores, como Int o String. Una funci贸n puede devolver otra funci贸n, puede tomar otra funci贸n como par谩metro y puede ser construida componiendo funciones. Esto ofrece una "cola" m谩s fuerte para combinar los m贸dulos de tu programa. Una funci贸n que eval煤a alguna expresi贸n puede formar parte de la computaci贸n como un argumento, por ejemplo; haciendo as铆 m谩s modular a la funci贸n. Tambi茅n puedes tener que una funci贸n contruye otra funci贸n. Por ejemplo, se puede definir una funci贸n "diferenciar" que diferenciar谩 una funci贸n num茅ricamente dada. Entonces, si tienes una funci贸n "f", puedes definir "f' = differentiate f", y usarla como lo har铆as en un contexto matem谩tico. Estos tipos de funciones se llaman ''funciones de orden superior''. Aqu铆 hay un peque帽o ejemplo en Haskell de una funci贸n numOf que cuenta el n煤mero de elementos en una lista que satisface cierta propiedad. <haskell>numOf p xs = length (filter p xs)</haskell> Despu茅s discutiremos la sintaxis de Haskell, pero lo que esta l铆nea dice es "Para obtener el resultado, filtra la lista xs con la prueba p y computa el largo del resultado". Ahora p es una funci贸n que toma un elemento y devuelve True (verdadero) o False (falso) determinando si el elemento pasa o no la prueba. numOf es una funci贸n de orden superios, parte de su funcionalidad es tomada como un argumento. Se debe notar que filter es tambi茅n una funci贸n de orden superior, toma una "funci贸n de prueba" como argumento. Juguemos con esta funci贸n y definamos algunas funciones m谩s especializadas a partir de ella. <haskell>numOfEven xs = numOf even xs</haskell> Aqu铆 definimos la funci贸n numOfEven que cuenta la cantidad de elementos pares en una lista. Notemos que no es necesario declarar expl铆citamente xs como un par谩metro. Podr铆amos haber escrito numOfEven = numOf even. De hecho una definici贸n muy clara. Pero por el momento, declararemos expl铆citamente los par谩metros. Ahora definamos una funci贸n que cuenta el n煤mero de elementos que son mayores o iguales a 5 : <haskell>numOfGE5 xs = numOf (>=5) xs</haskell> Aqu铆 la funci贸n de prueba es simplemente ">=5" que se la pasamos a numOf para obtener la funcionalidad que necesitamos. Ahora debieras ver que la modularidad de la programaci贸n funcional nos permite definir funciones gen茅ricas donde parte de la funcionalidad se pasa como argumento, que luego podremos usar para definir nombres para cualquier funci贸n especializada. Este peque帽o ejemplo es en cierta manera trivial, no deber铆a ser muy dif铆cil reescribir las definiciones de la funciones de m谩s arriba, pero para funciones m谩s complejas esto es muy pr谩ctico. Tu puedes, por ejemplo, escribir una funci贸n para recorrer un 谩rbol binario auto-balanceado y tomar parte de la funcionalidad como par谩metro (por ejemplo, la funci贸n de comparaci贸n). Esto te permitir铆a recorrer un 谩rbol sobre cualquier tipo de datos, simplemente proveyendo la funci贸n de comparaci贸n que necesites. De esta manera puedes dedicar m谩s esfuerzo en asegurarte que la funci贸n general es correcta, y despu茅s todas las funciones especializadas ser谩n tambi茅n correctas. Sin mencionar que no tendr谩s que copiar y pegar c贸digo en tu proyecto. Este concepto tambi茅n es factible en lenguajes imperativos. En algunos lenguajes orientados a objetos uno tiene que proveer un "Objeto comparador" para 谩rboles y otras estructuras de datos. La diferencia es que la forma 脿 la Haskell es mucho m谩s intuitiva y elegante (crear un tipo distinto s贸lo para comparar otros tipos y despu茅s pasar un objeto de este tipo no es una forma elegante de hacerlo), y por ello es m谩s probable que sea usado frecuentemente (y no solo en bibliotecas est谩ndares). Un concepto central en los lenguajes funcionales es que el resultado de una funci贸n est谩 determinada por su entrada, y s贸lo por su entrada. 隆No hay efectos laterales! Esto tambi茅n se extiende a las variables - las variables en Haskell no var铆an. Esto puede sonar extra帽o si tu estas acostumbrado a la programaci贸n imperativa (donde la mayor parte del c贸digo consiste en cambiar el "contenido" de una variable), pero es realmente muy natural. Una variable en Haskell es un nombre al que se le da un valor; y no, como en los lenguajes imperartivos, una abstracci贸n de alg煤n concepto de bajo nivel como una celda de memoria . Cuando se piensa a las variables como atajos para valores (justo como en matem谩ticas), tiene sentido que no se permitan las modificaciones de las variables. Tu no esperar铆as que "4 = 5" sea una asignaci贸n v谩lida en ning煤n lenguaje de programaci贸n; por lo tanto, es extra帽o que "x = 4; x = 5" est茅 permitido. Esto es d铆ficil de captar para programadores muy acostumbrados a lenguajes imperativos, pero no es tan extra帽o como parece a primera vista. Por ello, cuando empieces a pensar cosas como "Esto es demasiado rebuscado, me vuelvo a C++!", trata de obligarte a continuar aprendiendo Haskell - estar谩s contento de haberlo hecho. Eliminar efectos laterales de la ecuaci贸n permite que las expresiones sean evaluadas en cualquier orden. Una funci贸n puede devolver siempre el mismo resultado si recibe la misma entrada - sin excepciones. Este determinismo elimina toda una clase de errores encontrados en programas imperativos. De hecho, uno podr铆a argumentar que la mayor铆a de los errores en sistemas grandes pueden ser atribuidos a efectos laterales - si no causados directamente por ellos, entonces causados por un dise帽o que se basa en efectos laterales. Esto significa que los programas funcionales tienden a tener muchos menos errores que los imperativos. === Conclusi贸n === Como los lenguajes funcionales son m谩s intuitivos y ofrecen m谩s formas y form谩s m谩s f谩ciles de hacer las cosas, los programas funcionales tienden a ser m谩s cortos (usualmente entre 2 y 10 veces). La sem谩ntica est谩 m谩s cercana al problema que en una versi贸n imperativa, lo que facilita la verificaci贸n de la correcci贸n de una funci贸n. M谩s aun, Haskell no permite efectos laterales, esto lleva a tener menos errores. De esta manera, los programas en Haskell son m谩s f谩ciles de escribir, m谩s robustos y m谩s f谩ciles de mantener.
Summary:
Please note that all contributions to HaskellWiki are considered to be released under simple permissive license (see
HaskellWiki:Copyrights
for details). If you don't want your writing to be edited mercilessly and redistributed at will, then don't submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!
Cancel
Editing help
(opens in new window)
Toggle limited content width