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.
fuente
Respuestas:
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
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.
fuente
¿Qué tal un lenguaje de programación orientado a pilas ? El gato alcanza tus puntos altos. Está:
El Dr. Dobbs publicó un artículo breve sobre Cat en 2008, aunque el lenguaje ha cambiado ligeramente.
fuente
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.
fuente
Llego un poco tarde pero veo que nadie ha mencionado un par de paradigmas y lenguajes relacionados que pueden interesarte por su alto nivel de abstracción y generalidad:
fuente
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:
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 .
fuente
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.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.
fuente
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.
fuente
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).
fuente
Factor será una buena elección.
fuente
Podrías empezar a buscar en Lisp .
Prolog también es un lenguaje genial.
fuente
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.
fuente
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 # .
fuente
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.
fuente