Difference between revisions of "Es/Introduccion"

From HaskellWiki
Jump to navigation Jump to search
(Gentle Intro -> tutorial section.)
 
(6 intermediate revisions by 2 users not shown)
Line 6: Line 6:
   
 
==¿Porqué usar Haskell?==
 
==¿Porqué usar Haskell?==
 
 
Escribir programas grandes que funcionen correctamente es difícil y costoso. Mantener esos programas es aún más difícil y costoso tambien. Los lenguajes de programación funcional, tales como Haskell, pueden hacerlo mucho más fácil y económicos. Por ejemplo, un usuario nuevo quién escribió una pequeña DBMS relacional en Haskell comentó lo siguiente:
 
Escribir programas grandes que funcionen correctamente es difícil y costoso. Mantener esos programas es aún más difícil y costoso tambien. Los lenguajes de programación funcional, tales como Haskell, pueden hacerlo mucho más fácil y económicos. Por ejemplo, un usuario nuevo quién escribió una pequeña DBMS relacional en Haskell comentó lo siguiente:
 
<blockquote>
 
<blockquote>
Line 47: Line 46:
   
 
Otro lenguaje cercanamente funcional bien conocido, es el lenguaje estándar de búsqueda de base de datos SQL. Una búsqueda SQL es una expresión que involucra proyecciones, selecciones, uniones y así sucesivamente. La búsqueda especifica qué relación debería de ser computada, sin especificar cómo debería ser computada. La búsqueda puede ser evaluada en cualquier orden. Las implementaciones de SQL a menudo ejecutan extensas optimizaciones de búsqueda las cuales (junto a otros factores) calculan el mejor orden para evaluar la expresión.
 
Otro lenguaje cercanamente funcional bien conocido, es el lenguaje estándar de búsqueda de base de datos SQL. Una búsqueda SQL es una expresión que involucra proyecciones, selecciones, uniones y así sucesivamente. La búsqueda especifica qué relación debería de ser computada, sin especificar cómo debería ser computada. La búsqueda puede ser evaluada en cualquier orden. Las implementaciones de SQL a menudo ejecutan extensas optimizaciones de búsqueda las cuales (junto a otros factores) calculan el mejor orden para evaluar la expresión.
 
   
 
===¿Qué tiene de bueno la programación funcional?===
 
===¿Qué tiene de bueno la programación funcional?===
 
 
Las hojas de cálculo y SQL son ambos lenguajes muy especializados. Los lenguajes de programación funcional toman las mismas ideas, y las mueven hacia el plano de una programación de propósito más general. Para tener una idea de cómo se ve un programa funcional, y la expresividad de lenguajes funcionales, mira los siguientes algoritmos de quicksort. Ambos ordenan una sequencia de números en orden ascendente usando un método estándar llamado "quicksort". El primer programa está escrito en Haskell y el segundo en C.
 
Las hojas de cálculo y SQL son ambos lenguajes muy especializados. Los lenguajes de programación funcional toman las mismas ideas, y las mueven hacia el plano de una programación de propósito más general. Para tener una idea de cómo se ve un programa funcional, y la expresividad de lenguajes funcionales, mira los siguientes algoritmos de quicksort. Ambos ordenan una sequencia de números en orden ascendente usando un método estándar llamado "quicksort". El primer programa está escrito en Haskell y el segundo en C.
   
Line 104: Line 101:
 
1990, pp. 17 - 42.
 
1990, pp. 17 - 42.
 
</BLOCKQUOTE>
 
</BLOCKQUOTE>
  +
Un ensayo un poco menos formal inspirado por el artículo mencionado puede encontrarse en:
A slightly less formal essay inspired by the paper above can be found in
 
 
<BLOCKQUOTE>
 
<BLOCKQUOTE>
[[Why Haskell Matters |<STRONG>Why Haskell Matters</STRONG>]] originally by [mailto:sylvan@dtek.chalmers.se Sebastian Sylvan]
+
[[Por que Haskell importa |<STRONG>Por qué Haskell importa</STRONG>]] escrito originalmente (en inglés) por [mailto:sylvan@dtek.chalmers.se Sebastian Sylvan].
 
</BLOCKQUOTE>
 
</BLOCKQUOTE>
   
Line 156: Line 153:
   
 
Los lenguajes no-estrictos ofrecen exactamante esta clase de evaluación en-demanda. Las estructuras de datos son evaluadas sólo lo suficiente cómo para entregar la respuesta necesaria, y partes de ellas pueden no ser evaluadas del todo. Como en el caso de los comandos Unix, esto provee poderosas &quot;conexiones&quot; para combinar programas existentes. Esto significa que es posible <B>re-usar programas</B> , ó piezas de programas, mucho más a menudo que con una configuración imperativa. La evaluación perezosa nos permite escribir programas más <B>modulares</B>.
 
Los lenguajes no-estrictos ofrecen exactamante esta clase de evaluación en-demanda. Las estructuras de datos son evaluadas sólo lo suficiente cómo para entregar la respuesta necesaria, y partes de ellas pueden no ser evaluadas del todo. Como en el caso de los comandos Unix, esto provee poderosas &quot;conexiones&quot; para combinar programas existentes. Esto significa que es posible <B>re-usar programas</B> , ó piezas de programas, mucho más a menudo que con una configuración imperativa. La evaluación perezosa nos permite escribir programas más <B>modulares</B>.
 
   
 
====6. Abstracciones poderosas====
 
====6. Abstracciones poderosas====
 
En general, los lenguajes funcionales ofrecen nuevas formas muy poderosas para encapsular <B>abstracciones</B>. Una abstracción te permite definir un objeto cuyo funcionamiento interno se encuentra oculto; un procedimiento en C, por ejemplo, es una abstracción. La abstracción es la ''clave'' para construir programas modulares fáciles de mantener, tanto así, que una buena pregunta para hacerse respecto a cualquier lenguaje es "¿qué mecanismo de abstracciones ofrece?".
 
En general, los lenguajes funcionales ofrecen nuevas formas muy poderosas para encapsular <B>abstracciones</B>. Una abstracción te permite definir un objeto cuyo funcionamiento interno se encuentra oculto; un procedimiento en C, por ejemplo, es una abstracción. La abstracción es la ''clave'' para construir programas modulares fáciles de mantener, tanto así, que una buena pregunta para hacerse respecto a cualquier lenguaje es "¿qué mecanismo de abstracciones ofrece?".
   
El mecanismo de abstracción poderoso disponible en los lenguajes funcionales son las <B>funciones de primera clase</B>. En Haskell una función es un ciudadano de primera clase: puede ser libremente pasada hacia otras funciones, retornada cómo el resultado de una función, almacenada en una estructura de datos, y así ser usada dentro de cualquier otra operación válida. Resulta que el buen uso de las funciones de primera clase mejoran substancialmente la estructura y modularidad de muchos programas.
+
El mecanismo poderoso de abstracción disponible en los lenguajes funcionales son las <B>funciones de primera clase</B>. En Haskell una función es un ciudadano de primera clase: puede ser libremente pasada hacia otras funciones, retornada cómo el resultado de una función, almacenada en una estructura de datos, y así ser usada dentro de cualquier otra operación válida. Resulta que el buen uso de las funciones de primera clase mejoran substancialmente la estructura y modularidad de muchos programas.
   
<h4> 7. Built-in memory management</h4>
+
<h4> 7. Administrador de memoria</h4>
  +
Muchos programas sofisticados necesitan asignar memoria dinámica del montículo. Esto es hecho en C con una llamada a <tt>malloc</tt>, seguido por código para inicializar el espacio de memoria asignado. El programador es responsable por retornar el espacio de memoria usado cuando no se necesite, una notoria fuente de errores con operaciones de punteros. Para hacerlo peor, <tt>malloc</tt> es bastante pesado en cuanto a ejecución, así que los programadores a menudo usan <tt>malloc</tt> para asignar un gran espacio de memoria, y entonces a partir de allí, asignar memoria de forma "manual".
Very many sophisticated programs need to allocate dynamic memory from a heap. In C this is done with a call to <tt> malloc</tt>, followed by code to initialize the store just allocated. The programmer is responsible for returning the store to the free pool when it isn't needed any more, a notorious source of "dangling-pointer" errors. To make matters worse, <tt>malloc</tt> is fairly expensive performance-wise, so programmers often <tt>malloc</tt> a single large chunk of store, and then allocate "by hand" out of this.
 
   
  +
Cada lenguaje funcional libra al programador de esta carga de administración de memoria. El espacio es almacenado e inicializado implícitamente, y recuperado automáticamente por el colector de basura (garbage collector). La tecnología de administración de memoria y del colector de basura está bien desarrollada, y los costos de ejecución son muy mínimos.
Every functional language relieves the programmer of this storage management burden. Store is allocated and initialized implicitly, and recovered automatically by the garbage collector. The technology of storage allocation and garbage collection is now well developed, and the performance costs are rather slight.
 
   
<h3>When C is better</h3>
+
<h3>¿Cuando C es mejor?</h3>
  +
Claro, no es todo color de rosas. El quicksort en C usa una técnica extremadamente ingeniosa, inventada por Hoare, en donde ordena el array ''en lugar''; eso significa, sin usar ningún espacio de almacenamiento extra. Como resultado, corre rápidamente, y en un pequeño espacio de memoria. En contraste, el programa en Haskell asigna bastante memoria extra detrás de la escena, y corre más lento que el programa en C equivalente.
It isn't all roses, of course. The C quicksort uses an extremely
 
ingenious technique, invented by Hoare, whereby it sorts the array
 
''in place''; that is, without using any extra storage. As a
 
result, it runs quickly, and in a small amount of memory. In
 
contrast, the Haskell program allocates quite a lot of extra memory
 
behind the scenes, and runs rather slower than the C program.
 
   
  +
En efecto, el quicksort en C hace una administración de memoria muy ingeniosa, intercambiando esta complejidad algorítmica por una reducción en los costos de administración de almacenamiento.
In effect, the C quicksort does some very ingenious storage
 
management, trading this algorithmic complexity for a reduction in
 
run-time storage management costs.
 
   
  +
En aplicaciones dónde la ejecución es requerida a cualquier costo, ó donde la meta es la optimización de algorítmos de bajo nivel, un lenguaje imperativo como C probablemente sería mejor elección que Haskell, porque ofrece un control más cercano sobre la forma exacta en el cual se esta llevando a cabo la computación.
In applications where performance is required at any cost, or when the
 
goal is detailed tuning of a low-level algorithm, an imperative
 
language like C would probably be a better choice than Haskell,
 
exactly because it provides more intimate control over the exact way
 
in which the computation is carried out.
 
   
====Functional vs imperative====
+
====Funcional vs. imperativo====
  +
Pero pocos programas requieren ejecución a cualquier costo! Después de todo, nosotros dejamos de escribir programas en ensamblador hace mucho tiempo, excepto quizás para búcles internos claves. Los beneficios de tener un modelo de programación con más soporte (un número arbitrario de nombres para variables locales en lugar de un conjunto limitado de números de registros, por ejemplo) sobre-pasa el modesto costo de ejecución.
But few programs require performance at any cost! After all, we all
 
stopped writing assembly-language programs, except perhaps for key
 
inner loops, long ago. The benefits of having a more supportive
 
programming model (an arbitrary number of named, local variables
 
instead of a fixed number of registers, for example) far outweigh the
 
modest run-time costs.
 
   
  +
De igual forma, se aceptan los costos de un sistema de paginación de memoria virtual, por un modelo de programación que ofrece mejor soporte como es el espacio de direcciones virtuales infinitas. Los días del uso de memoria explícita han terminado.
Similarly, we willingly accept the costs of a virtual memory paging
 
system, in exchange for the more supportive programming model of an
 
infinite virtual address space. The days of explicit memory overlays
 
are over.
 
   
  +
Los lenguajes funcionales dan otro gran salto hacia un modelo más elevado de programación. Los programas son más fáciles de diseñar, escribir y mantener, pero el lenguaje ofrece al programador con menor control sobre la máquina. Para la mayoría de los programas el resultado es perfectamente aceptable.
Functional languages take another large step towards a higher-level
 
programing model. Programs are easier to design, write and maintain,
 
but the language offers the programmer less control over the machine.
 
For most programs the result is perfectly acceptable.
 
   
===What is Haskell?===
+
===¿Qué es Haskell?===
  +
Haskell es un moderno lenguaje estándar de programación puramente funcional, no-estricto. Ofrece todas las características explicadas arriba, incluyendo tipado polimórfico, evaluación perezosa y funciones de primera clase. Tambien posee un innovador sistema de tipo el cual soporta una forma sistemática de sobrecarga y un sistema de módulos.
Haskell is a modern, standard, non-strict, purely-functional
 
programming language. It provides all the features sketched above,
 
including polymorphic typing, lazy evaluation and higher-order
 
functions. It also has an innovative type system which supports a
 
systematic form of overloading and a module system.
 
   
  +
Está especialmente diseñado para manejar una amplia gama de aplicaciones, desde análisis numérico hasta simbólico. Para alcanzar estos objetivos, Haskell posee una sintaxis expresiva, y una rica variedad de tipos primitivos, incluyendo enteros y racionales de precisión arbitraria, también como los tipos de enteros, punto flotante y booleanos más convencionales.
It is specifically designed to handle a wide range of applications,
 
from numerical through to symbolic. To this end, Haskell has an
 
expressive syntax, and a rich variety of built-in data types,
 
including arbitrary-precision integers and rationals, as well as the
 
more conventional integer, floating-point and boolean types.
 
   
  +
Hay una amplia variedad de [[Compilers and interpreters| compiladores e intérpretes]] disponibles. Todos son gratuitos. Los nuevos usuarios pueden comenzar con [http://haskell.org/hugs/ Hugs], un pequeño, y portable intérprete Haskell.
There are a number of [[Compilers and interpreters|compilers and interpreters]] available. All are
 
free. First-time users may want to start with [http://haskell.org/hugs/ Hugs], a small, portable Haskell interpreter.
 
   
See also [[History_of_Haskell|the History of Haskell]]
+
Mira tambien, [[History_of_Haskell| La Historia de Haskell]]
   
===Does Anyone Use Functional Programming?===
+
===¿Alguien usa la Progamación Funcional?===
  +
Los lenguajes de programación funcional son usados en bastantes aplicaciones.
Functional programming languages are used in substantial applications.
 
  +
Por ejemplo:
For example:
 
 
<ul>
 
<ul>
  +
* Software AG, una importante compañia de software Alemana, vende un sistema experto (Experto Natural) el cual está programado en un lenguaje funcional. Sus usuarios encuentran fácil desarrollar sus aplicaciones en este lenguaje, através del cual pueden acceder a una base de datos interna del sistema. Toda la aplicación corre en una super-computadora IBM.
* Software AG, a major German software company, market an expert system (Natural Expert) which is programmed in a functional language. Their users find it easy to develop their applications in this language, through which they gain access to an underlying database system. It all runs on an IBM mainframe.
 
  +
* Ericsson desarrolló un nuevo lenguaje funcional, Erlang, para usar en sus aplicaciones de telefonía en el futuro. Ya han escrito aplicaciones con 130k lineas de código Erlang, y lo encuentran mucho más corto y rápido de desarrollar.
*Ericsson have developed a new functional language, Erlang, to use in their future telephony applications. They have already written 130k-line Erlang applications, and find them very much shorter and faster to develop.
 
  +
* Amoco llevó a cabo un experimento en el cual re-escribieron una fracción substancial de su principal código para la simulación de reservas petrolíferas en un lenguaje funcional, una aplicación crítica. El programa resultante fué mucho más corto, y su producción reveló un número de errores en el programa existente. Amoco subsecuentemente paso el programa funcional a .... con excelentes resultados.
*Amoco ran an experiment in which they re-coded in a functional language a substantial fraction of their main oil-reservoir simulation code, a critical application. The resulting program was vastly shorter, and its production revealed a number of errors in the existing software. Amoco subsequently transcribed the functional program into ... with encouraging results. <!-- Into what? Don't leave us hanging here. -->
 
  +
* Un investigador en la corporación MTTRE está usando Haskell para desarrollar un prototipo de sus aplicaciones para el procesamiento de señales.
*A researcher at the MITRE corporation is using Haskell to prototype his digital signal-processing applications.
 
*Researchers at Durham University used a functional language in a seven-year project to build LOLITA, a 30,000-line program for natural-language understanding.
+
* Investigadores en la Durham University usaron un lenguaje funcional en un proyecto de 7 años para construir LOLITA, un programa de 30,000 lineas para la comprensión de lenguajes naturales.
  +
* Query es el lenguaje de búsqueda del sistema de base de datos orientada a objeto O2. O2Query es probablemente el lenguaje de búsqueda de base de datos más sofisticado disponible comercialmente y es un lenguaje funcional.
*Query is the query language of the O2 object-oriented database system. O2Query is probably the most sophisticated commercially-available object-oriented database query language and it is a functional language.
 
  +
*ICAD Inc comercializa un sistema CAD para ingenieros mecánicos y aeronáuticos. El lenguaje en el cual los ingenieros escriben sus diseños es funcional, y usa evaluación perezosa extensivamente para evitar evaluar partes del diseño que no se encuentran actualmente visible en la pantalla. Esto produce mejoras significantes en la ejecución.
*ICAD Inc market a CAD system for mechanical and aeronautical engineers. The language in which the engineers describe their design is functional, and it uses lazy evaluation extensively to avoid recomputing parts of the design which are not currently visible on the screen. This results in substantial performance improvements.
 
*An incestuous example: the Glasgow Haskell compiler is written in Haskell: a 30,000-line application.
+
*Un buen ejemplo: El compilador Glasgow Haskell está escrito en Haskell: una aplicación de 30,000 líneas de código.
 
</ul>
 
</ul>
Some other examples of [[Haskell in practice]].
+
Otros ejemplos de [[Haskell in practice]] (Inglés).
   
Clifford Beshers, of [http://www.linspire.com/ Linspire Inc]., describes their experience with Haskell, and functional programming:
+
Clifford Beshers, of [http://www.linspire.com/ Linspire Inc]., comenta su experiencia con Haskell, y con la programación funcional:
   
 
<blockquote>
 
<blockquote>
  +
Linspire, Inc. ha usado programación funcional desde su aparición en el 2001, comenzando con un extensivo uso de O'Caml, y un estable cambio a Haskell a medida que sus implementaciones y librerias han madurado. Detección de Hardware, empaquetamiento de programas y generación de páginas web CGI son todas las áreas donde nosotros hemos usado programación funcional extensivamente.
Linspire, Inc. has used functional programming since its inception in
 
2001, beginning with extensive use of O'Caml, with a steady shift to
 
Haskell as its implementations and libraries have matured. Hardware
 
detection, software packaging and CGI web page generation are all areas
 
where we have used functional programming extensively.
 
 
</blockquote>
 
</blockquote>
   
 
<blockquote>
 
<blockquote>
  +
El conjunto de características de Haskell nos permite remplazar mucho de nuestro uso de pequeños lenguajes (ejemplo, bash ó awk) y lenguajes de segundo nivel (C ó C++ enlazados a un lenguaje interpretado), permitiéndonos un desarrollo más rápido, mejor compartición de código e implementaciones más rápidas. Sobre todo, usamos la verificación estática de tipos para minimizar errores en tiempo de ejecución en aplicaciones que corren en ambientes desconocidos y para envolver programas en funciones fuertemente tipadas y así asegurar que pasamos argumentos válidos.
Haskell's feature set lets us replace much of our use of little
 
languages (e.g., bash or awk) and two-level languages (C or C++ bound to
 
an interpreted language), allowing for faster development, better code
 
sharing and ultimately faster implementations. Above all, we value
 
static type checking for minimizing runtime errors in applications that
 
run in unknown environments and for wrapping legacy programs in strongly
 
typed functions to ensure that we pass valid arguments.
 
 
</blockquote>
 
</blockquote>
   
===Other frequently-asked questions===
+
===Otras preguntas frecuentes===
  +
''¿Es la programación funcional difícil de aprender?''
''Is functional programming hard to learn?''
 
 
<blockquote>
 
<blockquote>
  +
La programación funcional sí requiere un cambio de perspectiva, lo cual se hace difícil para algunos programadores. PEro la experiencia de Ericsson en entrenar programadores en Erlang es que la mayoría encuentran la transición muy fácil - asumiendo que ellos toman seriamente el entrenamiento en lugar de pensar que pueden "entenderlo todo en un dia".
Functional programming does require a change in perspective, which
 
some programmers find hard. But Ericsson's experience in training
 
programmers in Erlang is that most find the transition easy -
 
provided they take the training need seriously rather than assuming
 
that they can "pick it up on the day".
 
 
</blockquote>
 
</blockquote>
  +
''¿Son los programas funcionales muy lentos?''
''Aren't functional programs very slow?''
 
  +
<blockquote>
<blockquote>They used to be, perhaps 20 years ago. But the compilers
 
  +
Quizás 20 años atras, ellos solían serlo. Desde entonces los compiladores han evolucionado. Los programas en Haskell corren rápido para todo tipo de aplicaciones a excepciones de aquellas que demandan mucha optimización. Al momento de escribir esto, Haskell compilado via GHC está en el 2nd lugar (detrás de C) en el [http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all Great Language Shootout],con otros lenguajes funcionales con puntaje alto tambien.
have long since caught up. Haskell programs run fast for all but the
 
most performance-demanding applications. At the time of writing, Haskell
 
compiled via GHC is in 2nd place (behind C) in the
 
[http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all Great Language Shootout],
 
with other functional languages also ranked highly.
 
 
</blockquote>
 
</blockquote>
  +
''Ya tengo una aplicación grande en C ó C++; ¿Puedo beneficiarme de la programación funcional sin re-escribir mi sistema entero?''
 
''I already have a large application in C or C++; can I benefit from
 
functional programming without rewriting my whole system?''
 
 
<blockquote>
 
<blockquote>
  +
Haskell ha sido exitósamente integrado en aplicaciones existentes de diversas maneras. [http://www.haskell.org/hdirect/ HaskellDirect] es una herramienta basada en IDL (Lenguaje de Descripción de Interfaz) que le permite a los programas Haskell trabajar con componentes de software. Interfaces de bajo nivel C/C++ pueden ser generadas con [http://www.haskell.org/greencard Green Card] ó
 
  +
[http://www.cse.unsw.edu.au/~chak/haskell/c2hs/ C->Haskell], permitiendo una cercana integración entre Haskell y C. Estas herramientas han sido usadas para construir un gran número de exitósos sistemas con lenguajes mezclados.
Haskell has been successfully integrated into existing applications in
 
a number of ways.
 
[http://www.haskell.org/hdirect/ HaskellDirect] is
 
an IDL (Interface Description Language) based tool that allows Haskell
 
programs to work with software components. Low level C/C++ interfaces
 
can be generated with
 
[http://www.haskell.org/greencard Green Card] or
 
[http://www.cse.unsw.edu.au/~chak/haskell/c2hs/ C->Haskell], allowing
 
tight integration between Haskell and C. These tools have been used
 
to build a large number of successful, mixed language systems.
 
 
</blockquote>
 
</blockquote>
  +
''¿Qué librerias soporta Haskell?''
 
'' What libraries does Haskell support?''
 
 
<blockquote>
 
<blockquote>
  +
Muchas librerias de programas han sido desarrolladas para Haskell. Mira la
Many software libraries have been developed for Haskell. See the
 
[[Libraries and tools| list of Haskell libraries]] for a list of much of
+
[[Libraries and tools| Lista de librerías Haskell ]] para una lista de la mayoría de lo que está disponible.
what is available.
 
 
 
</blockquote>
 
</blockquote>
  +
''¿Qué otras herramientas para Haskell existen?''
 
'' What other software tools for Haskell are there? ''
 
 
<blockquote>
 
<blockquote>
  +
Glasgow Haskell viene con un perfil el cual te permite encontrar cuales partes de tu programa están consumiendo la mayoría del tiempo y espacio. Chalmers Haskell tiene una herramienta de perfil de espacio, y un simulador quasi-paralelo el cual te permite experimentar con corridas de tu programa en paralelo. Hugs también tiene algunas herramientas similares. Para una lista completa, verifica [[Libraries and tools|Página de Herramientas]].
Glasgow Haskell comes with a profiler which allows you to find which
 
parts of your program are consuming most time and space. Chalmers
 
Haskell has a space-profiling tool, and a quasi-parallel simulator
 
which allows you to experiment with running your program in
 
parallel. Hugs also has some similar tools. For a complete list, check
 
the [[Libraries and tools|tools page]].
 
 
</blockquote>
 
</blockquote>
  +
''¿Puedo obtener un contrato de soporte ó ayuda en linea?''
 
''Can I get a support contract or a help-line?''
 
 
<blockquote>
 
<blockquote>
  +
Si querías ayuda, solía ser el caso, que tenías que persuadir a un grupo de investigación de Haskell de que tu problema era lo suficientemente interesante ó importante cómo para que ellos invirtieran tiempo ayudándote gratis.
It used to be the case that if you wanted help, you had to persuade a
 
Haskell research group that your problem was interesting enough or
 
important enough that they should spend time helping you for free.
 
 
<br>
 
<br>
  +
Aunque esa sigue siendo una opción válida, hay ahora un
Whilst that is still an option, there is now a
 
[[Consultants|directory of Haskell Consultants]] who provide:
+
[[Consultants|Directorio de Consultantes Haskell]] quiénes ofrecen:
 
 
<ul>
 
<ul>
  +
*Soporte para compiladores, herramientas y librerías.
*Support for compilers, tools and libraries.
 
  +
*Ayuda para mejorar la calidad del código (tiempo, espacio, robustez, mantenimiento, etc.) usando analizadores de código y herramientas.
*Help with improving code quality (time, space, robustness, maintainability, etc.) using code reviews and tools.
 
  +
*Ayuda con el uso de librerías, herramientas y características avanzadas de Haskell tales como extensiones en su sistema de tipo, manejo de excepciones, la interfaz para funciónes extranjeras (FFI), y concurrencia.
*Help with using libraries, tools and advanced Haskell features such as type system extensions, exception handling, the foreign function interface, test harnesses, and concurrency.
 
  +
*Desarrollo de librerías y aplicaciones.
*Library and application development.
 
  +
*Entrenamiento de personal.
*Staff training.
 
 
</ul>
 
</ul>
  +
Estas compañias e individuos tienden a trabajar cercanamente con los programadores desarrollando Haskell (y usualmente han hecho grandes contribuciones a Haskell también).
These companies and individuals tend to work closely with those
 
developing Haskell (indeed, they have usually made major
 
contributions to Haskell themselves).
 
 
 
</blockquote>
 
</blockquote>
''How can I learn Haskell?''
+
''¿Cómo puedo aprender Haskell?''
 
<blockquote>
 
<blockquote>
  +
Para más ejemplos y explicaciones, visita [[Tutorials]]. También hay un número de libros que usan Haskell; visita [[Books]].
For more example and explanations, look at the [http://www.haskell.org/tutorial/ Gentle Introduction to Haskell]. There are a
 
number of textbooks that use Haskell; see [[Books]].
 
 
</blockquote>
 
</blockquote>
  +
''Comparaciones con otros lenguajes.''
 
''Comparisons to other languages''
 
 
<blockquote>
 
<blockquote>
  +
Un cuadro comparando características de Haskell con lenguajes similares
A table comparing features of Haskell to similar languages esta [[Comparison of functional programming languages|aqui]].
 
  +
[[Comparison of functional programming languages|aqui]].
 
</blockquote>
 
</blockquote>
   
''Based on a paper by Simon Peyton Jones.''
+
''Basado en un escrito por Simon Peyton Jones.''
  +
  +
  +
{{traduccion|titulo=Introduction}}

Latest revision as of 04:51, 9 December 2007

Haskell es un lenguaje de programación para computadoras. Específicamente, es un lenguaje polimórficamente tipificado, perezoso, puramente funcional , muy diferente a la mayoría de los otros lenguajes de programación.

El lenguaje recibe su nombre en honor a Haskell Brooks Curry, por sus trabajos en lógica matemática que sirvieron como fundamento para el desarrollo de lenguajes funcionales. Haskell está basado en el cálculo lambda , por lo tanto el símbolo lambda es usado como logo.


¿Porqué usar Haskell?

Escribir programas grandes que funcionen correctamente es difícil y costoso. Mantener esos programas es aún más difícil y costoso tambien. Los lenguajes de programación funcional, tales como Haskell, pueden hacerlo mucho más fácil y económicos. Por ejemplo, un usuario nuevo quién escribió una pequeña DBMS relacional en Haskell comentó lo siguiente:

WOW! Yo básicamente escribí esto sin probarlo, sólo pensando acerca de mi programa en términos de transformaciones entre tipos. Escribí el código de ejemplos/pruebas y no tuve casi ningun error de implementación en el código!. El compilador/sistema-de-tipos es realmente realmente bueno en evitar que cometas errores de código!. Yo nunca habia tenido en mi vida un bloque de código tan grande que funcionara en el primer intento. Estoy absolutamente impresionado.

Incluso si tú no estas en una posición para usar Haskell en tus proyectos de programación, aprender Haskell puede hacerte un mejor programador en cualquier lenguaje.

Yo aprendí Haskell un par de años atrás, habiendo previamente programado en Python y (muchos) otros lenguajes. Recientemente he estado usando Python para un proyecto (la elección ha sido determinada tanto por aspectos técnicos y no-técnicos), y me doy cuenta que mi estilo de programar en Python ha sido ampliamente influenciado (para mejor, espero ;-) por mi experiencia de programación en Haskell.

Graham Klyne

Haskell te ofrece:

    • Un incremento substancial de productividad para el programador (Ericsson alcanzó un factor de mejoría entre 9 y 25 usando Erlang, un lenguaje de programación funcional similar a Haskell, en uno de sus experimentos en programas de telefonía).
    • Código más corto, claro y fácil de mantener.
    • Menos errores, mayor confiabilidad.
    • Menor diferencia semántica; entre el programador y el lenguaje.
    • Desarrollo de programas en menor tiempo.

Haskell es un lenguaje de un amplio espectro, conveniente para una gran variedad de aplicaciones. Específicamente para programas que necesitan ser fáciles de modificar y de mantener.

Gran parte de la vida de un programa se invierte en especificación, diseño y mantenimiento, y no en programación. Los lenguajes funcionales son magníficos para escribir especificaciones que de hecho puedan ser ejecutadas (y por lo tanto probadas y depuradas). Tal especificación es el primer prototipo del programa final.

Los programas funcionales son también relativamente fácil de mantener, porque el código es más corto, claro, y el riguroso control sobre efectos colaterales (side-effects) elimina una amplia clase de interacciones imprevisibles.

¿Qué es la programación funcional?

C, Java, Pascal, Ada, y la gran mayoría de los lenguajes, son todos imperativos. Ellos son "imperativos" en el sentido de que consisten en una secuencia de comandos, los cuales son ejecutados estrictamente uno después de otro. Haskell es un lenguaje funcional. Un programa funcional es una expresión, la cual es ejecutada mediante su evaluación.

Cualquiera que haya usado una hoja de cálculo tiene experiencia en programación funcional. En una hoja de cálculo, se especifíca el valor de cada celda en términos de los valores de otras celdas. El enfoque es que se debe computar, no en cómo debería ser computado. Por ejemplo:

    • No se especifica el orden en el cual las celdas deberían ser calculadas - en cambio, confiamos que la hoja de cálculo evaluará las celdas en un orden que respete sus dependencias.
    • No le decimos a la hoja de cálculo cómo reservar su memoria - en cambio, esperamos que nos presente un plano aparentemente infinito de celdas, y en dónde se reserve memoria sólo para esas celdas que esten usándose.
    • Nosotros especificamos el valor de una celda mediante una expresión (cuyas partes pueden ser evaluadas en cualquier orden), en lugar de mediante una secuencia de comandos que computen su valor.

Una interesante consecuencia de no especificar el orden de evaluación en la hoja de cálculo es que la noción de asignación no es muy útil. Después de todo, si no sabes exactamente cuando una asignación sucederá, no puedes hacer mucho uso de ella!. Esto contrasta fuertemente con programas escritos en lenguajes convencionales como C, los cuales consisten esencialmente de una secuencia cuidadosamente especificada de asginaciones, ó Java, en el cual el orden de las llamadas a métodos es crucial para el significado de un programa.

Esto se enfoca en el alto-nivel "qué" en lugar del bajo-nivel "cómo" ; esta es una característica distintiva de los lenguajes de programación funcional.

Otro lenguaje cercanamente funcional bien conocido, es el lenguaje estándar de búsqueda de base de datos SQL. Una búsqueda SQL es una expresión que involucra proyecciones, selecciones, uniones y así sucesivamente. La búsqueda especifica qué relación debería de ser computada, sin especificar cómo debería ser computada. La búsqueda puede ser evaluada en cualquier orden. Las implementaciones de SQL a menudo ejecutan extensas optimizaciones de búsqueda las cuales (junto a otros factores) calculan el mejor orden para evaluar la expresión.

¿Qué tiene de bueno la programación funcional?

Las hojas de cálculo y SQL son ambos lenguajes muy especializados. Los lenguajes de programación funcional toman las mismas ideas, y las mueven hacia el plano de una programación de propósito más general. Para tener una idea de cómo se ve un programa funcional, y la expresividad de lenguajes funcionales, mira los siguientes algoritmos de quicksort. Ambos ordenan una sequencia de números en orden ascendente usando un método estándar llamado "quicksort". El primer programa está escrito en Haskell y el segundo en C.

El programa en C describe los pasos en particular que la máquina debe llevar a cabo para ordenar -- con la mayoría del código tratando con detalles de bajo-nivel para manipular datos -- en cambio, el programa en Haskell codifica el algoritmo de ordenación en un nivel mucho más elevado, lo cual mejora la brevedad y claridad del código como resultado.

Quicksort en Haskell

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

Quicksort en C

void qsort(int a[], int lo, int hi) {
{
  int h, l, p, t;

  if (lo < hi) {
    l = lo;
    h = hi;
    p = a[hi];

    do {
      while ((l < h) && (a[l] <= p)) 
          l = l+1;
      while ((h > l) && (a[h] >= p))
          h = h-1;
      if (l < h) {
          t = a[l];
          a[l] = a[h];
          a[h] = t;
      }
    } while (l < h);

    t = a[l];
    a[l] = a[hi];
    a[hi] = t;

    qsort( a, lo, l-1 );
    qsort( a, l+1, hi );
  }
}

Exáminemos algunos de los beneficios de Haskell y de la programación funcional. Un caso más detallado para la programación funcional puede ser encontrado en

Why Functional Programming Matters by John Hughes, The Computer Journal, Vol. 32, No. 2, 1989, pp. 98 - 107. Also in: David A. Turner (ed.): Research Topics in Functional Programming, Addison-Wesley, 1990, pp. 17 - 42.

Un ensayo un poco menos formal inspirado por el artículo mencionado puede encontrarse en:

Por qué Haskell importa escrito originalmente (en inglés) por Sebastian Sylvan.

1. Brevedad

Los programas funcionales tienden a ser mucho más concisos que sus contrapartes imperativos. Quicksort es un caso algo extremo, pero en general los programas funcionales son mucho más cortos (de dos a diez veces más cortos).

2. Fácil de entender

Los programas funcionales son a menudo más fáciles de entender. Se debería ser capaz de entender el programa anterior sin ningún conocimiento previo de tanto Haskell ó quicksort. Lo mismo ciertamente no puede ser dicho del programa en C. Toma algo de tiempo entenderlo, e incluso si se entiende, es extremadamente fácil cometer un ligero error y terminar con un programa incorrecto. Aquí una explicación detallada del quicksort en Haskell:

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

La primera línea se lee: "Cuando se ordena una lista vacía ([]), el resultado es otra lista vacía". La segunda línea se lee: "Para ordenar una lista cuyo primer elemento es nombrado x y el resto el cuál es nombrado xs, ordena los elementos de xs que sean menores que x, ordena los elementos de xs que sean mayores qué, ó igual a x, y concatena (++) los resultados, con x unido en el medio."

3. Sin errores de memoria (core dumps)

La mayoría de los lenguajes funcionales, y Haskell en particular, son fuertemente tipíficados, eliminando una amplia clase de errores fáciles de cometer en tiempo de compilación. En particular, fuertemente tipíficado significa no más errores de memoria! Simplemente no hay ningúna posibilidad de tratar un entero como un puntero, ó referenciar un puntero núlo.

4. Reúso de Código

Por supuesto, el tipíficado fuerte está disponible en muchos lenguajes imperativos, tales como Ada ó Pascal. Sin embargo, el sistema de tipo de Haskell es mucho menos restrictivo que, digamos, el de Pascal, porque usa polimorfismo.

Por ejemplo, el programa qsort en la Figura 1 no sólamente ordenará listas de enteros, sino también listas de números de punto flotante, listas de carácteres, listas de listas; verdaderamente, ordenará listas de cualquier cosa para lo cual tendría significado tener las operaciones de "menor que" y "mayor que". En contraste, la versión de C puede sólo ordenar un array de enteros, y nada más.

El polimorfismo mejora la re-usabilidad del código.

5. Conexión fuerte

Los lenguajes funcionales no-estrictos tienen otra característica poderosa: Ellos evalúan del programa sólo lo necesario para obtener la respuesta - esto se conoce cómo evaluación perezosa. Esta característica es similar a las tuberías (pipes) de UNIX. Por ejemplo, el comando Unix

grep printf Foo.c | wc

cuenta el número de líneas en el archivo Foo.c el cuál incluye la cadena printf.

El comando

grep printf Foo.c

obtiene todas las líneas que contengan la cadena "printf", mientras que el comando "wc" las cuenta. La tubería, escrita "|", toma la salida del primer comando y la pasa al segundo. Los dos comandos se ejecutan juntos, así que la salida del primero es consumida casi inmediatamente por el segundo. De esta forma, ningún archivo intermedio necesita ser creado. Se puede pensar de wc "exigiendo" líneas de grep.

Si el segundo comando sólo necesita parte de la salida del primero, entonces la ejecución del primer comando puede nunca necesitar completarse. Por ejemplo

grep printf Foo.c | head 5

sólo imprime las primeras 5 líneas que contengan "printf". No existe ninguna necesidad de modificar el comando grep para hacerlo considerar que su ejecución puede ser abandonada.

Los lenguajes no-estrictos ofrecen exactamante esta clase de evaluación en-demanda. Las estructuras de datos son evaluadas sólo lo suficiente cómo para entregar la respuesta necesaria, y partes de ellas pueden no ser evaluadas del todo. Como en el caso de los comandos Unix, esto provee poderosas "conexiones" para combinar programas existentes. Esto significa que es posible re-usar programas , ó piezas de programas, mucho más a menudo que con una configuración imperativa. La evaluación perezosa nos permite escribir programas más modulares.

6. Abstracciones poderosas

En general, los lenguajes funcionales ofrecen nuevas formas muy poderosas para encapsular abstracciones. Una abstracción te permite definir un objeto cuyo funcionamiento interno se encuentra oculto; un procedimiento en C, por ejemplo, es una abstracción. La abstracción es la clave para construir programas modulares fáciles de mantener, tanto así, que una buena pregunta para hacerse respecto a cualquier lenguaje es "¿qué mecanismo de abstracciones ofrece?".

El mecanismo poderoso de abstracción disponible en los lenguajes funcionales son las funciones de primera clase. En Haskell una función es un ciudadano de primera clase: puede ser libremente pasada hacia otras funciones, retornada cómo el resultado de una función, almacenada en una estructura de datos, y así ser usada dentro de cualquier otra operación válida. Resulta que el buen uso de las funciones de primera clase mejoran substancialmente la estructura y modularidad de muchos programas.

7. Administrador de memoria

Muchos programas sofisticados necesitan asignar memoria dinámica del montículo. Esto es hecho en C con una llamada a malloc, seguido por código para inicializar el espacio de memoria asignado. El programador es responsable por retornar el espacio de memoria usado cuando no se necesite, una notoria fuente de errores con operaciones de punteros. Para hacerlo peor, malloc es bastante pesado en cuanto a ejecución, así que los programadores a menudo usan malloc para asignar un gran espacio de memoria, y entonces a partir de allí, asignar memoria de forma "manual".

Cada lenguaje funcional libra al programador de esta carga de administración de memoria. El espacio es almacenado e inicializado implícitamente, y recuperado automáticamente por el colector de basura (garbage collector). La tecnología de administración de memoria y del colector de basura está bien desarrollada, y los costos de ejecución son muy mínimos.

¿Cuando C es mejor?

Claro, no es todo color de rosas. El quicksort en C usa una técnica extremadamente ingeniosa, inventada por Hoare, en donde ordena el array en lugar; eso significa, sin usar ningún espacio de almacenamiento extra. Como resultado, corre rápidamente, y en un pequeño espacio de memoria. En contraste, el programa en Haskell asigna bastante memoria extra detrás de la escena, y corre más lento que el programa en C equivalente.

En efecto, el quicksort en C hace una administración de memoria muy ingeniosa, intercambiando esta complejidad algorítmica por una reducción en los costos de administración de almacenamiento.

En aplicaciones dónde la ejecución es requerida a cualquier costo, ó donde la meta es la optimización de algorítmos de bajo nivel, un lenguaje imperativo como C probablemente sería mejor elección que Haskell, porque ofrece un control más cercano sobre la forma exacta en el cual se esta llevando a cabo la computación.

Funcional vs. imperativo

Pero pocos programas requieren ejecución a cualquier costo! Después de todo, nosotros dejamos de escribir programas en ensamblador hace mucho tiempo, excepto quizás para búcles internos claves. Los beneficios de tener un modelo de programación con más soporte (un número arbitrario de nombres para variables locales en lugar de un conjunto limitado de números de registros, por ejemplo) sobre-pasa el modesto costo de ejecución.

De igual forma, se aceptan los costos de un sistema de paginación de memoria virtual, por un modelo de programación que ofrece mejor soporte como es el espacio de direcciones virtuales infinitas. Los días del uso de memoria explícita han terminado.

Los lenguajes funcionales dan otro gran salto hacia un modelo más elevado de programación. Los programas son más fáciles de diseñar, escribir y mantener, pero el lenguaje ofrece al programador con menor control sobre la máquina. Para la mayoría de los programas el resultado es perfectamente aceptable.

¿Qué es Haskell?

Haskell es un moderno lenguaje estándar de programación puramente funcional, no-estricto. Ofrece todas las características explicadas arriba, incluyendo tipado polimórfico, evaluación perezosa y funciones de primera clase. Tambien posee un innovador sistema de tipo el cual soporta una forma sistemática de sobrecarga y un sistema de módulos.

Está especialmente diseñado para manejar una amplia gama de aplicaciones, desde análisis numérico hasta simbólico. Para alcanzar estos objetivos, Haskell posee una sintaxis expresiva, y una rica variedad de tipos primitivos, incluyendo enteros y racionales de precisión arbitraria, también como los tipos de enteros, punto flotante y booleanos más convencionales.

Hay una amplia variedad de compiladores e intérpretes disponibles. Todos son gratuitos. Los nuevos usuarios pueden comenzar con Hugs, un pequeño, y portable intérprete Haskell.

Mira tambien, La Historia de Haskell

¿Alguien usa la Progamación Funcional?

Los lenguajes de programación funcional son usados en bastantes aplicaciones. Por ejemplo:

    • Software AG, una importante compañia de software Alemana, vende un sistema experto (Experto Natural) el cual está programado en un lenguaje funcional. Sus usuarios encuentran fácil desarrollar sus aplicaciones en este lenguaje, através del cual pueden acceder a una base de datos interna del sistema. Toda la aplicación corre en una super-computadora IBM.
    • Ericsson desarrolló un nuevo lenguaje funcional, Erlang, para usar en sus aplicaciones de telefonía en el futuro. Ya han escrito aplicaciones con 130k lineas de código Erlang, y lo encuentran mucho más corto y rápido de desarrollar.
    • Amoco llevó a cabo un experimento en el cual re-escribieron una fracción substancial de su principal código para la simulación de reservas petrolíferas en un lenguaje funcional, una aplicación crítica. El programa resultante fué mucho más corto, y su producción reveló un número de errores en el programa existente. Amoco subsecuentemente paso el programa funcional a .... con excelentes resultados.
    • Un investigador en la corporación MTTRE está usando Haskell para desarrollar un prototipo de sus aplicaciones para el procesamiento de señales.
    • Investigadores en la Durham University usaron un lenguaje funcional en un proyecto de 7 años para construir LOLITA, un programa de 30,000 lineas para la comprensión de lenguajes naturales.
    • Query es el lenguaje de búsqueda del sistema de base de datos orientada a objeto O2. O2Query es probablemente el lenguaje de búsqueda de base de datos más sofisticado disponible comercialmente y es un lenguaje funcional.
    • ICAD Inc comercializa un sistema CAD para ingenieros mecánicos y aeronáuticos. El lenguaje en el cual los ingenieros escriben sus diseños es funcional, y usa evaluación perezosa extensivamente para evitar evaluar partes del diseño que no se encuentran actualmente visible en la pantalla. Esto produce mejoras significantes en la ejecución.
    • Un buen ejemplo: El compilador Glasgow Haskell está escrito en Haskell: una aplicación de 30,000 líneas de código.

Otros ejemplos de Haskell in practice (Inglés).

Clifford Beshers, of Linspire Inc., comenta su experiencia con Haskell, y con la programación funcional:

Linspire, Inc. ha usado programación funcional desde su aparición en el 2001, comenzando con un extensivo uso de O'Caml, y un estable cambio a Haskell a medida que sus implementaciones y librerias han madurado. Detección de Hardware, empaquetamiento de programas y generación de páginas web CGI son todas las áreas donde nosotros hemos usado programación funcional extensivamente.

El conjunto de características de Haskell nos permite remplazar mucho de nuestro uso de pequeños lenguajes (ejemplo, bash ó awk) y lenguajes de segundo nivel (C ó C++ enlazados a un lenguaje interpretado), permitiéndonos un desarrollo más rápido, mejor compartición de código e implementaciones más rápidas. Sobre todo, usamos la verificación estática de tipos para minimizar errores en tiempo de ejecución en aplicaciones que corren en ambientes desconocidos y para envolver programas en funciones fuertemente tipadas y así asegurar que pasamos argumentos válidos.

Otras preguntas frecuentes

¿Es la programación funcional difícil de aprender?

La programación funcional sí requiere un cambio de perspectiva, lo cual se hace difícil para algunos programadores. PEro la experiencia de Ericsson en entrenar programadores en Erlang es que la mayoría encuentran la transición muy fácil - asumiendo que ellos toman seriamente el entrenamiento en lugar de pensar que pueden "entenderlo todo en un dia".

¿Son los programas funcionales muy lentos?

Quizás 20 años atras, ellos solían serlo. Desde entonces los compiladores han evolucionado. Los programas en Haskell corren rápido para todo tipo de aplicaciones a excepciones de aquellas que demandan mucha optimización. Al momento de escribir esto, Haskell compilado via GHC está en el 2nd lugar (detrás de C) en el Great Language Shootout,con otros lenguajes funcionales con puntaje alto tambien.

Ya tengo una aplicación grande en C ó C++; ¿Puedo beneficiarme de la programación funcional sin re-escribir mi sistema entero?

Haskell ha sido exitósamente integrado en aplicaciones existentes de diversas maneras. HaskellDirect es una herramienta basada en IDL (Lenguaje de Descripción de Interfaz) que le permite a los programas Haskell trabajar con componentes de software. Interfaces de bajo nivel C/C++ pueden ser generadas con Green Card ó C->Haskell, permitiendo una cercana integración entre Haskell y C. Estas herramientas han sido usadas para construir un gran número de exitósos sistemas con lenguajes mezclados.

¿Qué librerias soporta Haskell?

Muchas librerias de programas han sido desarrolladas para Haskell. Mira la Lista de librerías Haskell para una lista de la mayoría de lo que está disponible.

¿Qué otras herramientas para Haskell existen?

Glasgow Haskell viene con un perfil el cual te permite encontrar cuales partes de tu programa están consumiendo la mayoría del tiempo y espacio. Chalmers Haskell tiene una herramienta de perfil de espacio, y un simulador quasi-paralelo el cual te permite experimentar con corridas de tu programa en paralelo. Hugs también tiene algunas herramientas similares. Para una lista completa, verifica Página de Herramientas.

¿Puedo obtener un contrato de soporte ó ayuda en linea?

Si querías ayuda, solía ser el caso, que tenías que persuadir a un grupo de investigación de Haskell de que tu problema era lo suficientemente interesante ó importante cómo para que ellos invirtieran tiempo ayudándote gratis.
Aunque esa sigue siendo una opción válida, hay ahora un Directorio de Consultantes Haskell quiénes ofrecen:

    • Soporte para compiladores, herramientas y librerías.
    • Ayuda para mejorar la calidad del código (tiempo, espacio, robustez, mantenimiento, etc.) usando analizadores de código y herramientas.
    • Ayuda con el uso de librerías, herramientas y características avanzadas de Haskell tales como extensiones en su sistema de tipo, manejo de excepciones, la interfaz para funciónes extranjeras (FFI), y concurrencia.
    • Desarrollo de librerías y aplicaciones.
    • Entrenamiento de personal.

Estas compañias e individuos tienden a trabajar cercanamente con los programadores desarrollando Haskell (y usualmente han hecho grandes contribuciones a Haskell también).

¿Cómo puedo aprender Haskell?

Para más ejemplos y explicaciones, visita Tutorials. También hay un número de libros que usan Haskell; visita Books.

Comparaciones con otros lenguajes.

Un cuadro comparando características de Haskell con lenguajes similares aqui.

Basado en un escrito por Simon Peyton Jones.



Nota: Esta es una traducción del artículo original en Inglés : Introduction