¿Qué idioma aprender después de Haskell? [cerrado]

85

Como mi primer lenguaje de programación, decidí aprender Haskell. Soy un estudiante de filosofía analítica, y Haskell me permitió crear rápida y correctamente programas de interés, por ejemplo, transductores para el análisis sintáctico del lenguaje natural, probadores de teoremas e intérpretes. Aunque solo he estado programando durante dos meses y medio, encontré la semántica y la sintaxis de Haskell 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 construcciones.

Sin embargo, programar en Haskell es como una brujerí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 elegir un lenguaje arbitrario, dejarlo y repetir. Así que pensé en plantear la pregunta aquí, junto con varias estipulaciones sobre el tipo de idioma 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 tipos. Esto ayuda a estructurar mis pensamientos sobre las funciones individuales y su relación con el programa en su conjunto. También facilita el razonamiento informal sobre la corrección de mi programa. Me preocupa la corrección, no la eficiencia.
  • Énfasis en la recursividad en lugar de la iteración. Utilizo construcciones iterativas en Haskell, pero las implemento de forma recursiva. Sin embargo, es mucho más fácil comprender la estructura de una función recursiva que un procedimiento iterativo complicado, especialmente cuando se utilizan combinadores y funciones de orden superior como mapas, pliegues y vinculación.
  • Es gratificante 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 lo fue. No estoy buscando C. El lenguaje debería imponer un paradigma conceptualmente interesante, que en mi opinión totalmente subjetiva, los C-likes no lo hacen.

Sopesar las respuestas : estas son solo notas, por supuesto. Solo 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, tipado estáticamente que enfatiza la recursividad significa otro lenguaje funcional. Si bien quiero seguir trabajando enérgicamente con Haskell, camccann y larsmans señalaron correctamente que otro lenguaje de este tipo "facilitaría demasiado la transición". Estos comentarios han sido muy útiles, ¡porque no estoy buscando escribir Haskell en Caml! De los asistentes de prueba, Coq y Agda parecen interesantes. En particular, Coq proporcionaría una sólida introducción a la lógica constructiva y la teoría de tipos formales. He pasado un poco de tiempo con predicados de primer orden y lógica modal (Mendellsohn, Enderton, algunos de Hinman), por lo que probablemente me divertiría mucho con Coq.

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

3) Tercero, Prolog. Prolog tiene una gran cantidad de material interesante, y su principal dominio 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 leer un poco de material introductorio, se clasifica con (2). ¡Y parece que el retroceso de Prolog siempre está siendo pirateado en Haskell!

4) De los lenguajes convencionales, Python parece el más interesante. Tim Yates hace que los idiomas suenen muy atractivos. Aparentemente, Python se enseña a menudo a estudiantes de primer año de informática; 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 prueba como Coq o Agda son los principales idiomas que se recomiendan.

danportin
fuente
34
2.5 meses no es suficiente tiempo para aprender ningún idioma en profundidad, lo siento por reventar tu burbuja.
Woot4Moo
20
Eso es ciertamente cierto. No quise dar a entender que había "aprendido" a Haskell, lo que sea que eso signifique. Quise decir que me siento cómodo usando el idioma. Claramente no "dejaré de aprender".
Danportin
10
@Michael: Codificar para la corrección en lugar de la eficiencia es algo de lo que me encantaría ver más ...
Deniz Dogan
24
@ Woot4Moo: Sin embargo, 2,5 meses es mucho tiempo para sentirse "cómodo" con un idioma. Doblemente si está familiarizado con la lógica formal y trabaja con conceptos abstractos de su formación filosófica. No tener que desaprender hábitos de otros idiomas también ayudaría en este caso.
CA McCann
8
@gnovice: Se ha preguntado muchas veces, sin duda. Pero esta es la primera vez que me encuentro con alguien que ha hecho su primera experiencia de programación seria con Haskell. Es como si la flecha del tiempo se hubiera invertido o algo así.
Muhammad Alkarouri

Respuestas:

85

Me gustaría ampliar mis conocimientos 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 recursividad en lugar de la iteración. (...)

Puede que estés facilitando demasiado la transición aquí, me temo. El sistema de tipos muy estricto y el estilo puramente funcional son característicos de Haskell y prácticamente cualquier cosa que se parezca a un lenguaje de programación convencional requerirá comprometer al menos algo en uno de estos. Entonces, con eso en mente, aquí hay algunas sugerencias generales destinadas a retener la mayoría de lo que parece gustarle de Haskell, pero con un cambio importante.

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

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

  • Comprométase un poco y acérquese a la corriente principal : Haskell pertenece a la amplia familia de lenguajes influenciados en gran medida por el aprendizaje automático, cualquiera de los cuales probablemente podría cambiar sin demasiada dificultad. Haskell es uno de los más estrictos en lo que respecta a las garantías de corrección de los tipos y el uso del estilo funcional, mientras que otros suelen ser estilos híbridos y / o hacer compromisos pragmáticos por varias razones. Si desea algo de exposición a la programación orientada a objetos y acceso a muchas plataformas tecnológicas convencionales, Scala en la JVM o F #on .NET tienen mucho en común con Haskell al tiempo que proporcionan 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 para más sistemas de tipos de Haskell y el potencial multiplataforma de Java, pero tiene una sintaxis más pesada y carece del poderoso soporte de primera parte del que disfruta F #.

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

CA McCann
fuente
4
I familia de Coq y Agda también puedes mirar Qi II .
Hynek -Pichi- Vychodil
¿Cuáles serían las molestas limitaciones de F # en tu opinión? Como alguien que aprende F # en su tiempo libre, tengo curiosidad por saberlo.
Lucas
7
@Lucas: Lo más grande frente a Haskell básico es la falta de polimorfismo de tipo superior y clases de tipos. Más allá de eso, bastantes extensiones específicas de GHC son bastante buenas. Nada de esto es un defecto fatal, pero después de acostumbrarse a Haskell se siente un poco torpe no tener esas cosas. Imagínese volver de C # moderno a usar C # 1.x ...
CA McCann
@HyneK: Este lenguaje Qi 2 a primera vista parece muy interesante y más flexible que Coq o Adga. Parece que el autor ha decidido dejarlo todo. ¿Hay algún movimiento para seguir trabajando en este idioma? No quisiera aprender algo que ya está medio muerto.
Alex
@Alex: parece que continúa como Shen: shenlanguage.org
amindfv
20

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

Primero dice que quiere ampliar sus horizontes. Luego, describe el tipo de lenguaje que desea, y sus horizontes suenan increíblemente como los horizontes que ya tiene. No ganarás mucho aprendiendo lo mismo una y otra vez.

Le sugiero que aprenda un Lisp, es decir, Common Lisp, Scheme / Racket o Clojure. Todos se escriben dinámicamente de forma predeterminada, pero cuentan con algún tipo de sugerencia de tipo o escritura estática opcional. Racket y Clojure son probablemente tus mejores apuestas.

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

Racket es mucho más antigua, pero ha ganado mucha potencia en el camino, como el soporte de tipo estático y un enfoque en la programación funcional. Creo que probablemente sacarías el máximo partido a Racket.

Los sistemas de macros en Lisps son muy interesantes y mucho más poderosos que cualquier otro que vea en cualquier otro lugar. Eso solo vale la pena al menos mirarlo.

Arrojar
fuente
3
Je, desde la perspectiva de Haskell, las sugerencias de tipo o la escritura estática opcional no se ven realmente tan diferentes de la escritura completamente dinámica. Es una mentalidad muy diferente. Dicho esto, los lenguajes Lisp-y son muy divertidos y creo que todos los programadores deberían dedicar al menos un tiempo a aprender.
CA McCann
19

Desde el punto de vista de lo que se adapta a su especialidad, la elección obvia parece un lenguaje lógico como Prolog o sus derivados. La programación lógica se puede hacer de manera muy ordenada en un lenguaje funcional (ver, por ejemplo, The Reasoned Schemer ), pero es posible que disfrute trabajando con el paradigma lógico directamente.

Un sistema interactivo de demostración de teoremas, como doce o coq, también podría llamarte la atención.

sclv
fuente
2
Como manifiesta interés en un lenguaje fuertemente tipado, recomendaría lambdaProlog, un lenguaje de programación lógica de orden superior tipado. Una implementación compilada es Teyjus - code.google.com/p/teyjus (divulgación: trabajé en Teyjus).
Zach Snow
18

Le aconsejo que aprenda Coq , que es un poderoso asistente de prueba con una sintaxis que le resultará cómoda al programador de 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 fue escrito en Coq, tenía propiedades comprobadas 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á escrito de forma dependiente, en Hackage y muy respetado por las personas que respeto, pero esas son razones suficientemente buenas para mí.

No esperaría que ninguno de estos fuera fácil. Pero si conoce a Haskell y quiere avanzar hacia un lenguaje que le dé más poder que el sistema de tipos de Haskell, entonces debería considerarlo.

Thomas M. DuBuisson
fuente
1
Agda suena como el "siguiente paso" natural de Haskell.
Deniz Dogan
5
También vale la pena señalar que si, como estudiante de filosofía, tiene mucha experiencia con la lógica formal, los asistentes de prueba al estilo de Curry-Howard pueden ser menos desconcertantes para él de lo que serían para la mayoría de los programadores veteranos.
CA McCann
11

Como no mencionó ninguna restricción además de sus intereses subjetivos y enfatizó 'gratificante de aprender' (bueno, de acuerdo, ignoraré la restricción de escritura estática), sugeriría aprender algunos idiomas de diferentes paradigmas, y preferiblemente los 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 lógica predominante
  • Smalltalk como el único lenguaje OOP verdadero (también interesante debido a su enfoque generalmente extremadamente centrado en la imagen)
  • tal vez Erlang o Clojure si está interesado en lenguajes forjados para programación concurrente / paralela / distribuida
  • Adelante para la programación orientada a pilas
  • ( Haskell para programación perezosa funcional estricta de tipo estático)

Especialmente Lisps (CL no tanto como Scheme) y Prolog (y Haskell) adoptan la recursividad.

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

Entonces, aunque puede parecer que ignoré la parte sobre que no tienes tiempo para probar algunos idiomas, creo que el tiempo que pases con cualquiera de estos no se desperdiciará, y deberías echarles un vistazo a todos.

danlei
fuente
No pude soportar las restricciones de Erlang que involucran a los guardianes;)
gorsky
10

¿Qué tal un lenguaje de programación orientado a pilas ? El gato alcanza tus puntos altos. Está:

  • Escrito estáticamente con inferencia de tipos.
  • Te hace repensar conceptos comunes de lenguajes imperativos como los bucles. La ejecución condicional y el bucle se manejan con combinadores .
  • Recompensa: lo obliga a comprender otro modelo de cálculo. Le ofrece otra forma de pensar y descomponer los problemas.

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

Corbin March
fuente
10

Si desea un Prolog con tipado fuerte (más), Mercury es una opción interesante. He incursionado en él en el pasado y me gustó la perspectiva diferente que me dio. También tiene moderación (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 una tipificación única, que se usa como alternativa a las mónadas (más específicamente, la mónada IO). La escritura de unicidad también hace cosas interesantes para trabajar con matrices.

yatima2975
fuente
8

A pesar de que no cumple con uno de sus grandes criterios (escritura estática *), voy a defender Python. Aquí hay algunas razones por las que creo que deberías 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 las listas por comprensión , por ejemplo. Tiene lambdas, funciones de primera clase y muchas composiciones de inspiración funcional en iteradores (mapas, pliegues, cremalleras ...). Le da la opción de elegir el paradigma que mejor se adapte al problema.
  • En mi humilde opinión, es, como Haskell, hermoso de codificar. La sintaxis es simple y elegante.
  • Tiene una cultura que se centra en hacer las cosas de forma sencilla, en lugar de centrarse demasiado en la eficiencia.

Entiendo que si estás buscando algo más. La programación lógica, por ejemplo, podría ser lo ideal para ti, como han sugerido otros.


* Supongo que te refieres a la escritura estática aquí, ya que quieres declarar los tipos. Técnicamente, Python es un lenguaje fuertemente tipado, ya que no se puede interpretar arbitrariamente, digamos, una cadena como un número. Curiosamente, existen derivados de Python que permiten la escritura estática, como Boo .

Tim Yates
fuente
Sin embargo, el sistema de tipo fuerte no significa necesariamente solo una escritura "estática".
Deniz Dogan
+1 también vea mi comentario sobre la respuesta de larsmans. Pero tenga cuidado de anunciar Python como bastante funcional. Por ejemplo, las expresiones generadoras son generalmente preferidos sobre map, filter, etc, pero aún así, los generadores y las expresiones generadoras se sentirán familiarizados con alguien que conozca la evaluación perezosa y dichas funciones.
16
De Verdad? Creo que Python parece particularmente funcional para las personas que no han hecho mucha programación funcional. He usado mucho Python y Haskell, y aunque Python es un buen lenguaje, y ciertamente ha tomado prestadas algunas cosas de los lenguajes funcionales, sigue siendo un 99% imperativo.
CA McCann
@camccann Tienes razón, mi perspectiva es diferente, por lo que te ofrezco esto como una alternativa interesante. Como alguien que aprendió primero la programación imperativa, aprecio que Python me permita usar técnicas funcionales donde son apropiadas y evitarlas donde algo más tiene sentido. No estoy argumentando que "es" funcional, solo que hace un buen compromiso.
Tim Yates
Los hábitos aprendidos de Haskell pueden convertirlo en un programador de Python mucho mejor que otros que lo aprendieron como primer idioma.
u0b34a0f6ae
8

Te recomendaría Erlang. No es un lenguaje de tipo fuerte y debería probarlo. Es un enfoque de programación muy diferente y es posible que encuentre problemas en los que la escritura fuerte no sea la mejor herramienta (TM). De todos modos, Erlang le proporciona herramientas para la verificación de tipo estático (mecanografiado, dializador) y puede usar una escritura fuerte en las partes en las que obtiene beneficios de ella. 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 hace cosquillas en el cerebro si tienes experiencia con C y Haskell.

Hynek -Pichi- Vychodil
fuente
8

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

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

Donde dudo un poco es en la parte gratificante de aprender . Aprenderlos fue gratificante para mí, sin duda. Pero dadas sus restricciones y su descripción de lo que quiere, parece que en realidad no está buscando algo mucho más diferente que Haskell.

Si no pusiera sus restricciones, habría sugerido Python o Erlang , los cuales lo sacarían de su zona de confort.

Muhammad Alkarouri
fuente
6

En mi experiencia, tipeo 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 escriben dinámicamente. Se han publicado muchos libros excelentes con un fuerte "gusto" teórico sobre Scheme en particular. Eche un vistazo a SICP , que también transmite mucha sabiduría informática general (intérpretes meta-circulares y similares).

Fred Foo
fuente
4
+1 para el primer párrafo, exactamente lo que pensé cuando leí la pregunta. En aras de aprender cosas nuevas, sugeriría un lenguaje imperativo moderno, como Python, especialmente porque no es lo que solían hacer los OP (escritura dinámica, iteradores en todas partes, etc.). También tiene conceptos avanzados muy interesantes como metaclases o generadores (que son sorprendentemente similares a las listas perezosas) / expresiones generadoras (que sirven como una generalización de listas por comprensión + generadores). Además, dicte y establezca reglas de comprensión.
3
@delnan: Haskell también tiene listas por comprensión y los generadores / iteradores se pueden expresar fácilmente en Haskell usando el tipo de lista estándar de Haskell. Entonces, las mayores diferencias entre los dos lenguajes serían, en mi opinión, la programación orientada a objetos y (la mayoría de las veces) las estructuras de datos impuras como los diccionarios.
Deniz Dogan
1
@Deniz Dogan: no olvide la falta de declaraciones y el alcance léxico adecuado en Python.
Fred Foo
5

Podrías empezar a buscar en Lisp .

Prolog también es un lenguaje genial.


fuente
5

Si decide alejarse de su preferencia por un sistema de tipos, es posible que le interese el lenguaje de programación J. Destaca 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 tus ideas preconcebidas sobre lo que te gustaría, pero échale un vistazo. Vale la pena descubrirlo con solo saber que está ahí fuera. La única fuente de implementaciones completas es J Software, jsoftware.com.

caleídico
fuente
0

Vaya con una de las corrientes principales. Dados los recursos disponibles, la comerciabilidad futura de su habilidad y el rico ecosistema de desarrolladores, creo que debería comenzar con Java o C # .

Angkor Wat
fuente
14
En comparación con Haskell, ambos son lenguajes bastante aburridos , en mi opinión.
missingfaktor
9
Pedirle a un Haskeller que se mude a Java es como pedirle a Bill Gates que se mude a un barrio pobre. : - /
missingfaktor
1
+1 Por sugerir algo que definitivamente hará que no te voten. Java y C # tienen ecosistemas agradables y son muy recomendables para trabajos serios. Como una ventaja definitiva, puede aprovechar su conocimiento de Haskell (, Java y C #) al usar Clojure en JVM o F # en CLR.
ponzao
6
@ponzao: Urgh, no, sugerir que alguien pase de Haskell a Java o C # es simplemente horrible y cruel. Scala, F # y Clojure son lenguajes mucho más agradables con los mismos beneficios que se obtienen al ejecutarse en JVM / CLR.
CA McCann
5
Para una filosofía analítica, Java o C # son una pérdida de tiempo.
MaD70
0

Gran pregunta: me la he estado haciendo recientemente después de pasar varios meses disfrutando de Haskell, aunque mi experiencia es muy diferente (química orgánica).

Como tú, C y los de su calaña están fuera de discusión.

Hoy he estado oscilando entre Python y Ruby como los dos lenguajes de scripting prácticos caballos de batalla (¿mulas?) Que ambos tienen algunos componentes funcionales para mantenerme feliz. Sin iniciar ningún debate rubyista / pitonista aquí, pero mi respuesta pragmática personal a esta pregunta es:

Aprenda cuál (Python o Ruby) primero tiene una excusa para aplicar.

jdo
fuente