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!
==Haskell vs POO == El gran beneficio de la programaci贸n orientada a objetos (POO) no es que uno pueda agrupar los datos con las funciones que act煤an sobre ellos en un objeto, el beneficio es que permite un buen encapsulamiento de datos (separando la interfaz de la implementaci贸n) y polimorfismo (permitiendo que un conjunto de tipo de datos se comporte de la misma manera). Sin embargo: ''隆Encapsulamiento de datos y polimorfismo no son exclusivos de POO!'' Haskell tiene herramientas para abstraer datos. No podemos meternos en ello sin haber visto el sistema de m贸dulos y c贸mo funcionan los tipos abstractos de datos (TAD) en Haskell, algo que est谩 bastante m谩s all谩 del alcance de este ensayo. Por ello, haremos una corta descripci贸n de c贸mo funcionan los TADs y el polimorfismo en Haskell. El encapsulamiento en Haskell se logra declarando cada tipo de datos en un m贸dulo independiente, y de este m贸dulo s贸lo se exporta la interfaz. Internamente puede haber muchas funciones que manipulan los datos reales, pero la interfaz es lo 煤nico visible desde fuera del m贸dulo. Notemos que el tipo de datos y las funciones que act煤an sobre 茅l no est谩n agrupadas en un "objeto", sino que est谩n (t铆picamente) agrupadas en el mismo m贸dulo; de esta manera uno puede elegir exportar s贸lo ciertas funciones (y no los constructores para el tipo de datos), logrando as铆 que estas funciones sean la 煤nica forma de manipular el tipo de datos - quedando "escondida" la implementaci贸n tras la interfaz. El polimorfismo se logra usando lo que se llama clases de tipo. Si tu tienes conocimientos previos de C++ o Java, puedes asociar las clases con algo parecido a un template para construir un objeto, pero eso no es lo que son las clases en Haskell. Una clase de tipo es realmente eso a lo que suena. Es un conjunto de reglas para determinar si una instancia de un tipo es una instancia de la clase. Haskell separa la instanciaci贸n de la clase de la construcci贸n del tipo de datos. Uno puede declarar un tipo "Porsche" como una instancia de la clase de tipo "Auto", digamos. Todas las funciones que pueden ser aplicadas a cualquier otro miembro de la clase de tipo Auto podr谩n ser aplicadas a un Porsche. Una clase que est谩 incluida en Haskell es la clase de tipo Show, y un tipo puede ser instanciado en esa clase dando una funci贸n show, que convierta una instancia de ese tipo en un String. Consecuentemente, las instancias de casi todos los tipos de Haskell pueden ser mostradas en la pantalla aplicando la funci贸n show para convertirlos en un String, y usando despu茅s la acci贸n de E/S correspondiente (hay m谩s sobre E/S en los tutoriales). Notemos cu谩n similar es esto con la noci贸n de objeto en POO cuando se considera el aspecto del polimorfismo. El sistema de Haskell es m谩s intuitivo para manejar el polimorfismo. Uno no necesita preocuparse en heredar en el orden correcto o asegurarse que la herencia tiene sentido. Una clase es simplemente una clase, y los tipos que son instancias de esta clase no tienen que compartir una relaci贸n de herencias padre-hijo. Si un tipo de datos cumple con los requisitos de una clase, entonces puede ser instanciada en esa clase. Simple, no? 驴Recuerdas el ejemplo de QuickSort? 驴Recuerdas que hab铆amos dicho que era polim贸rfico? El secreto detr谩s del polimorfismo en qsort es que est谩 definida para trabajar sobre listas de cualquier tipo que pertenezca a la clase Ord (por "Ordenado"). Ord tiene definida un conjunto de funciones, entre ellas "<" y ">" que son suficientes para nuestras necesidades, porque s贸lo necesitamos saber si un elemento es mayor que x o no. Por ello si fueramos a definir las funciones que requiere Ord para nuestro tipo Porsche (ser铆a suficiente implementar <= y ==, Haskell construir铆a el resto a partir de ellas) en una instanciaci贸n de la clase Ord, podr铆amos usar qsort para ordenar listas de Porsche (aun cuando no tenga sentido ordenar Porsches). Notemos que nunca dijimos nada sobre las clases a las que deb铆an pertenecer los elementos de la lista, Haskell inferir谩 esto autom谩ticamente viendo las funciones que hemos usado (en el ejemplo de qsort, solo "<" y ">=" son relevantes). Para resumir: Haskell incluye mecanismos para encapsulamiento de datos que igualan o pasan a aquellos de los lenguajes orientados a objetos. Lo 煤nico que Haskell no provee es una forma de agrupar funciones y datos en un objeto (aparte de construir un tipo de datos que incluya una funci贸n, recuerda que las funciones son datos!). Sin embargo, esto es un problema menor: para aplicar una funci贸n a un objeto, escribiremos "func obj a b c" en vez de algo como "obj.func a b c".
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