ventajas usos tipos peta librerias imprimir importar funciones ficheros español ejemplos como haskell programming-languages

usos - peta haskell en español



¿Qué idioma aprender después de Haskell? (17)

Me gustaría ampliar mi conocimiento de programación. (...) Pensé que plantearía la pregunta aquí, junto con varias estipulaciones sobre el tipo de lenguaje que estoy buscando. Algunos son subjetivos, otros están destinados a facilitar la transición de Haskell.

Sistema de tipo fuerte. (...) También facilita el razonamiento informal sobre la corrección de mi programa. Me preocupa la corrección, no la eficiencia.

Énfasis en la recursión en lugar de la iteración. (...)

Puede estar facilitando la transición un poco demasiado aquí, me temo. El sistema de tipo muy estricto y el estilo puramente funcional son característicos de Haskell y casi cualquier cosa que se asemeje a un lenguaje de programación convencional requerirá comprometer al menos un poco en uno de estos. Entonces, con eso en mente, aquí hay algunas sugerencias amplias destinadas a retener la mayoría de lo que parece que te gusta de Haskell, pero con un cambio importante.

  • Haga caso omiso de la practicidad y busque "más Haskell que Haskell" : el sistema de tipos de Haskell está lleno de agujeros, debido a la falta de determinación y otros compromisos desordenados. Limpie el desorden y agregue características más potentes y obtendrá idiomas como Coq y Agda , donde el tipo de una función contiene una prueba de su corrección (¡incluso puede leer la flecha de función -> como implicación lógica!). Estos lenguajes se han usado para pruebas matemáticas y para programas con requisitos de corrección extremadamente altos. Coq es probablemente el idioma más prominente del estilo, pero Agda tiene una sensación más de Haskell-y (además de estar escrita en Haskell).

  • Ignore los tipos, agregue más magia : si Haskell es hechicería, Lisp es la magia primaria y cruda de la creación. Los lenguajes de la familia Lisp (que también incluyen Scheme y Clojure ) tienen una flexibilidad casi sin paralelo combinada con un minimalismo extremo. Los lenguajes esencialmente no tienen sintaxis, escribiendo código directamente en la forma de una estructura de datos de árbol; la metaprogramación en Lisp es más fácil que la programación no meta en algunos idiomas.

  • Comprometerse un poco y acercarse a la corriente principal : Haskell pertenece a la amplia familia de idiomas influenciados por ML, cualquiera de los cuales podría cambiar sin demasiada dificultad. Haskell es uno de los más estrictos cuando se trata de garantizar la corrección de los tipos y el uso del estilo funcional, donde otros a menudo son estilos híbridos y / o hacen compromisos pragmáticos por varias razones. Si desea cierta exposición a OOP y acceso a muchas plataformas tecnológicas convencionales, Scala en JVM o F # en .NET tienen mucho en común con Haskell, a la vez que ofrecen una fácil interoperabilidad con las plataformas Java y .NET. F # es compatible directamente con Microsoft, pero tiene algunas limitaciones molestas en comparación con Haskell y problemas de portabilidad en plataformas que no son de Windows. Scala tiene contrapartes directas a más del sistema de tipos de Haskell y el potencial multiplataforma de Java, pero tiene una sintaxis más pesada y carece del poderoso soporte de primera mano que F # disfruta.

La mayoría de esas recomendaciones también se mencionan en otras respuestas, pero espero que mi razonamiento para ellas ofrezca alguna aclaración.

Como mi primer lenguaje de programación, decidí aprender Haskell. Soy un especialista en filosofía analítica, y Haskell me permitió crear rápida y correctamente programas de interés, por ejemplo, transductores para análisis de lenguaje natural, demostradores de teoremas e intérpretes. Aunque solo he estado programando durante dos meses y medio, encontré que la semántica y la sintaxis de Haskell son mucho más fáciles de aprender que los lenguajes imperativos más tradicionales, y me siento cómodo (ahora) con la mayoría de sus constructos.

Sin embargo, la programación en Haskell es como la hechicería, y me gustaría ampliar mis conocimientos de programación. Me gustaría elegir un nuevo lenguaje de programación para aprender, pero no tengo tiempo suficiente para seleccionar un idioma arbitrario, soltarlo y repetirlo. Así que pensé que plantearía la pregunta aquí, junto con varias estipulaciones sobre el tipo de lenguaje que estoy buscando. Algunos son subjetivos, otros están destinados a facilitar la transición de Haskell.

  • Sistema de tipo fuerte. Una de mis partes favoritas de la programación en Haskell es escribir declaraciones de tipo. Esto ayuda a estructurar mis pensamientos sobre las funciones individuales y su relación con el programa como un todo. También facilita el razonamiento informal sobre la corrección de mi programa. Me preocupa la corrección, no la eficiencia.
  • Énfasis en la recursión en lugar de la iteración. Utilizo construcciones iterativas en Haskell, pero las implemento recursivamente. Sin embargo, es mucho más fácil entender la estructura de una función recursiva que un procedimiento iterativo complicado, especialmente cuando se usan combinadores y funciones de orden superior como mapas, pliegues y bind.
  • Recompensar para aprender Haskell es un lenguaje gratificante para trabajar. Es un poco como leer a Kant. Mi experiencia hace varios años con C, sin embargo, no fue así. No estoy buscando C. El lenguaje debe hacer cumplir un paradigma conceptualmente interesante, que en mi opinión totalmente subjetiva, los C-me gusta no lo hacen.

Sopesando las respuestas : Estas son solo notas, por supuesto. Me gustaría responder a todos los que dieron respuestas bien formadas. Usted ha sido muy útil.

1) Varias respuestas indicaron que un lenguaje fuerte, estáticamente tipificado que enfatiza la recursividad significa otro lenguaje funcional. A pesar de que quiero continuar trabajando fuertemente con Haskell, camccann y larsmans señalaron correctamente que otro lenguaje similar "facilitaría demasiado la transición". ¡Estos comentarios han sido muy útiles, porque no estoy buscando escribir a Haskell en Caml! De los asistentes de pruebas, Coq y Agda parecen interesantes. En particular, Coq proporcionaría una introducción sólida a la lógica constructiva y la teoría formal de tipos. He pasado un poco de tiempo con el predicado de primer orden y la lógica modal (Mendellsohn, Enderton, algunos de Hinman), así que probablemente me divertiría mucho con Coq.

2) Otros muy favorecidos Lisp (Common Lisp, Scheme y Clojure). Por lo que sé, tanto Common Lisp como Scheme tienen un excelente material introductorio ( On Lisp y The Reasoned Schemer , SICP ). El material en SICP me hace inclinarme hacia Scheme. En particular, el Esquema a través del SICP cubriría una estrategia de evaluación diferente, la implementación de la pereza y la oportunidad de enfocarse en temas como continuación, intérpretes, cálculo simbólico, etc. Finalmente, como han señalado otros, el tratamiento del código / datos de Lisp sería completamente nuevo. Por lo tanto, me estoy inclinando fuertemente hacia la opción (2), un Lisp.

3) En tercer lugar, Prolog. Prolog tiene una gran cantidad de material interesante, y su dominio principal es exactamente el que me interesa. Tiene una sintaxis simple y es fácil de leer. No puedo comentar más en este momento, pero después de leer una descripción general de Prolog y analizar un poco el material introductorio, se clasifica con (2). ¡Y parece que el retroceso de Prolog siempre está siendo pirateado en Haskell!

4) De los lenguajes principales, Python parece el más interesante. Tim Yates hace que los idiomas suenen muy atractivos. Aparentemente, Python a menudo se enseña a estudiantes de primer año de CS; por lo que es conceptualmente rico o fácil de aprender. Tendría que investigar más.

¡Gracias a todos por sus recomendaciones! Parece que Lisp (Scheme, Clojure), Prolog o un asistente de pruebas como Coq o Agda son los lenguajes principales que se recomiendan.


¿Qué tal un lenguaje de programación orientado a la pila ? Cat golpea tus puntos altos. Es:

  • Estáticamente tipeado con inferencia tipo.
  • Hace que vuelvas a pensar en conceptos comunes de lenguajes imperativos como el bucle. La ejecución condicional y el bucle se manejan con combinators .
  • Recompensa: te obliga a entender otro modelo de computación. Te da otra manera de pensar y descomponer problemas.

El Dr. Dobbs publicó un breve artículo sobre Cat en 2008 aunque el lenguaje ha cambiado ligeramente.


A pesar de no cumplir con uno de sus grandes criterios (tipeo * estático), voy a defender Python. Aquí hay algunas razones por las que creo que debería echarle un vistazo:

  • Para un lenguaje imperativo, es sorprendentemente funcional. Esta fue una de las cosas que me llamó la atención cuando lo aprendí. Tome la lista de comprensiones , por ejemplo. Tiene lambdas, funciones de primera clase y muchas composiciones de inspiración funcional en iteradores (mapas, pliegues, cremalleras ...). Te da la opción de elegir el paradigma que mejor se adapte al problema.
  • En mi humilde opinión, es, como Haskell, hermoso codificar. La sintaxis es simple y elegante.
  • Tiene una cultura que se centra en hacer las cosas de manera directa, en lugar de centrarse demasiado en la eficiencia.

Aunque entiendo si estás buscando algo más. La programación lógica, por ejemplo, podría ser una buena idea, como otros han sugerido.

* Supongo que te refieres a escribir estático aquí, ya que quieres declarar los tipos. Techincally, Python es un lenguaje fuertemente tipado, ya que no se puede interpretar arbitrariamente, por ejemplo, una cadena como un número. Curiosamente, hay derivados de Python que permiten el tipado estático, como Boo .


Como no mencionó ninguna restricción además de sus intereses subjetivos y enfatizó ''recompensar para aprender'' (bueno, vale, ignoraré la restricción de tipeo estático), sugeriría que aprendiera algunos idiomas de diferentes paradigmas, y preferiblemente que son ''ejemplares'' para cada uno de ellos.

  • Un dialecto Lisp para el código-como-datos / homoiconicidad y porque son buenos, si no los mejores, ejemplos de lenguajes de programación funcionales dinámicos (más o menos estrictos)
  • Prolog como el lenguaje de programación de lógica predominante
  • Smalltalk como el único lenguaje de OOP verdadero (también interesante debido a su enfoque generalmente extremadamente centrado en la imagen)
  • tal vez Erlang o Clojure si está interesado en idiomas forjados para programación concurrente / paralela / distribuida
  • Adelante para la programación orientada a la pila
  • ( Haskell para la programación perezosa funcionalmente estática funcional estricta)

Especialmente Lisps (CL no tanto como Scheme) y Prolog (y Haskell) aceptan la recursión.

Aunque no soy un gurú en ninguno de estos idiomas, sí pasé un tiempo con cada uno de ellos, excepto Erlang y Forth, y todos me brindaron experiencias de aprendizaje reveladoras e interesantes, ya que cada uno aborda la resolución de problemas desde un ángulo diferente. .

Entonces, aunque parezca que ignoré la parte sobre que no tienes tiempo para probar algunos idiomas, prefiero pensar que el tiempo que pases con alguno de ellos no se desperdiciará, y deberías echar un vistazo a todos ellos.


Dada su descripción, sugeriría Ocaml o F # .

La familia ML es generalmente muy buena en términos de un sistema de tipo fuerte. El énfasis en la recursividad, junto con la coincidencia de patrones, también es clara.

Donde estoy un poco indeciso está en la parte gratificante de aprender . Aprenderlos fue gratificante para mí, sin duda. Pero dadas tus restricciones y tu descripción de lo que quieres, parece que en realidad no estás buscando algo mucho más diferente que Haskell.

Si no pusiste tus restricciones, habría sugerido Python o Erlang , que te sacarían de tu zona de confort.


Desde el punto de vista de lo que le conviene a su especialización, la elección obvia parece ser un lenguaje lógico como Prolog o sus derivados. La programación lógica se puede realizar de forma muy clara en un lenguaje funcional (consulte, por ejemplo, The Reasoned Schemer ), pero puede disfrutar trabajando directamente con el paradigma lógico.

Un sistema interactivo de demostración de teoremas, como twelf o coq, también podría parecerle de lujo.


En mi experiencia, la tipificación fuerte + énfasis en la recursividad significa otro lenguaje de programación funcional. Por otra parte, me pregunto si eso es muy gratificante, dado que ninguno de ellos será tan "puro" como Haskell.

Como han sugerido otros carteles, Prolog y Lisp / Scheme son agradables, aunque ambos se tipean dinámicamente. Se han publicado muchos libros excelentes con un fuerte "sabor" teórico sobre Scheme en particular. Eche un vistazo al SICP , que también transmite una gran cantidad de conocimientos generales de informática (intérpretes meta-circulares y similares).



Gran pregunta: me lo he estado preguntando recientemente después de pasar varios meses disfrutando a fondo Haskell, aunque mis antecedentes son muy diferentes (química orgánica).

Al igual que usted, C y su tipo están fuera de cuestión.

He estado oscilando entre Python y Ruby como los dos lenguajes prácticos de scripts de caballo de batalla de hoy (¿mulas?) Que tienen componentes funcionales para mantenerme contento. Sin comenzar ningún debate de Rubyist / Pythonist aquí, pero mi respuesta pragmática personal a esta pregunta es:

Conozca el (Python o Ruby) que primero tiene una excusa para aplicar.


Podrías empezar a buscar en Lisp .

Prolog es un lenguaje genial también.


Si decide desviarse de su preferencia por un sistema de tipo, es posible que le interese el lenguaje de programación J. Es sobresaliente por cómo enfatiza la composición de funciones. Si te gusta el estilo sin puntos en Haskell, la forma tácita de J será gratificante. Lo he encontrado extraordinariamente estimulante, especialmente con respecto a la semántica.

Es cierto que no se ajusta a sus ideas preconcebidas sobre lo que le gustaría, pero eche un vistazo. Solo saber que está por ahí vale la pena descubrirlo. La única fuente de implementaciones completas es J Software, jsoftware.com.


Si desea un Prolog fuerte (meramente) escrito, Mercury es una opción interesante. He incursionado en eso en el pasado y me gustó la diferente perspectiva que me dio. También tiene moded-ness (qué parámetros deben ser libres / fijos) y determinismo (¿cuántos resultados hay?) En el sistema de tipos.

Clean es muy similar a Haskell, pero tiene tipificación única, que se utiliza como una alternativa a las mónadas (más específicamente, la mónada IO). La singularidad al escribir también hace cosas interesantes para trabajar con matrices.


Te aconsejo que aprendas Coq , que es un poderoso asistente de prueba con sintaxis que se sentirá cómodo para el programador Haskell. Lo bueno de Coq es que se puede extraer a otros lenguajes funcionales, incluido Haskell. Incluso hay un paquete ( Meldable-Heap ) en Hackage que se escribió en Coq, tenía propiedades probadas sobre su funcionamiento y luego se extrajo a Haskell.

Otro lenguaje popular que ofrece más poder que Haskell es Agda : no conozco a Agda más allá de saber que está tipificado de manera dependiente, en Hackage, y es muy respetado por personas a las que respeto, pero esas son buenas razones para mí.

No esperaría que ninguno de estos sea fácil. Pero si conoce a Haskell y quiere avanzar hacia un lenguaje que le otorgue más poder que el sistema de tipo Haskell, entonces debe considerarlo.


Te recomendaría Erlang. No es un lenguaje fuerte y debe intentarlo. Es un enfoque muy diferente a la programación y es posible que haya problemas en los que la tipificación fuerte no es The Best Tool (TM). De todos modos, Erlang te proporciona herramientas para la verificación de tipo estático (typer, dializador) y puedes usar el tipado fuerte en las partes donde obtienes beneficios. Puede ser una experiencia interesante para ti, pero prepárate, será una sensación muy diferente. Si está buscando un "paradigma conceptualmente interesante", puede encontrarlos en Erlang, paso de mensajes, separación de memoria en lugar de compartir, distribución, OTP, manejo de errores y propagación de errores en lugar de "prevención" de errores, etc. Erlang puede estar muy lejos de tu experiencia actual, pero aún te hacen cosquillas en el cerebro si tienes experiencia con C y Haskell.


Ve con una de las principales transmisiones. Teniendo en cuenta los recursos disponibles, la comerciabilidad futura de su habilidad, rico ecosistema de desarrolladores, creo que debería comenzar con Java o C # .


Voy a ser ese tipo y sugeriré que estás preguntando algo equivocado.

Primero dices que quieres ampliar tus horizontes. Luego, describe el tipo de lenguaje que desea, y sus horizontes suenan increíblemente como los horizontes que ya tiene. No vas a ganar mucho aprendiendo lo mismo una y otra vez.

Le sugiero que aprenda un Lisp, es decir, Common Lisp, Scheme / Racket o Clojure. Todos están escritos dinámicamente de manera predeterminada, pero tienen algún tipo de sugerencia de tipo o tipado estático opcional. Racket y Clojure son probablemente tus mejores apuestas.

Clojure es más reciente y tiene más Haskellisms como inmutabilidad por defecto y mucha evaluación perezosa, pero está basado en Java Virtual Machine, lo que significa que tiene algunas verrugas extrañas (por ejemplo, la JVM no admite eliminación de llamadas finales, por lo que la recursión es amable de un truco).

Racket es mucho más antigua, pero ha adquirido mucha potencia en el camino, como el soporte de tipo estático y un enfoque en la programación funcional. Creo que probablemente saques el máximo provecho de Racket.

Los macro sistemas en Lisps son muy interesantes y mucho más poderosos que cualquier otro que veas en otro lado. Solo eso vale la pena mirar al menos.


Factor será una buena elección.