Como minha primeira linguagem de programação, decidi aprender Haskell. Sou formado em filosofia analítica e Haskell me permitiu criar de forma rápida e correta programas de interesse, por exemplo, transdutores para análise de linguagem natural, provadores de teoremas e intérpretes. Embora eu esteja programando há apenas dois meses e meio, achei a semântica e a sintaxe de Haskell muito mais fáceis de aprender do que as linguagens imperativas mais tradicionais e me sinto confortável (agora) com a maioria de suas construções.
Programar em Haskell é como feitiçaria, porém, e gostaria de ampliar meu conhecimento de programação. Gostaria de escolher uma nova linguagem de programação para aprender, mas não tenho tempo suficiente para escolher uma linguagem arbitrária, largá-la e repetir. Portanto, pensei em colocar a questão aqui, juntamente com várias estipulações sobre o tipo de linguagem que procuro. Alguns são subjetivos, outros têm como objetivo facilitar a transição de Haskell.
- Sistema de tipo forte. Uma das minhas partes favoritas da programação em Haskell é escrever declarações de tipo. Isso ajuda a estruturar meus pensamentos sobre funções individuais e sua relação com o programa como um todo. Também torna mais fácil o raciocínio informal sobre a correção do meu programa. Estou preocupado com a correção, não com a eficiência.
- Ênfase na recursão em vez de iteração. Eu uso construções iterativas em Haskell, mas as implemento recursivamente. No entanto, é muito mais fácil entender a estrutura de uma função recursiva do que um procedimento iterativo complicado, especialmente ao usar combinadores e funções de ordem superior como mapas, dobras e vinculação.
- É gratificante aprender. Haskell é uma linguagem gratificante de se trabalhar. É um pouco como ler Kant. Minha experiência de vários anos atrás com C, entretanto, não foi. Não estou procurando C. A linguagem deve impor um paradigma conceitualmente interessante, o que, em minha opinião inteiramente subjetiva, os C-likes não fazem.
Pesando as respostas : são apenas anotações, é claro. Gostaria apenas de responder a todos que deram respostas bem formadas. Você tem sido muito útil.
1) Várias respostas indicaram que uma linguagem forte e com tipagem estática enfatizando a recursão significa outra linguagem funcional. Embora eu queira continuar trabalhando fortemente com Haskell, camccann e larsmans apontaram corretamente que outra linguagem assim "facilitaria demais a transição". Esses comentários foram muito úteis, porque não estou procurando escrever Haskell em Caml! Dos assistentes de prova, Coq e Agda parecem interessantes. Em particular, Coq forneceria uma introdução sólida à lógica construtiva e à teoria formal dos tipos. Eu gastei um pouco de tempo com predicado de primeira ordem e lógica modal (Mendellsohn, Enderton, alguns de Hinman), então eu provavelmente me divertiria muito com Coq.
2) Outros favoreceram fortemente o Lisp (Common Lisp, Scheme e Clojure). Pelo que percebi, tanto Common Lisp quanto Scheme têm excelente material introdutório ( On Lisp e The Reasoned Schemer , SICP ). O material no SICP faz com que eu me incline para o Scheme. Em particular, o Scheme por meio do SICP cobriria uma estratégia de avaliação diferente, a implementação de preguiça e uma chance de enfocar tópicos como continuações, intérpretes, computação simbólica e assim por diante. Finalmente, como outros apontaram, o tratamento de código / dados de Lisp seria inteiramente novo. Portanto, estou inclinado fortemente para a opção (2), um Lisp.
3) Terceiro, Prolog. Prolog tem uma riqueza de material interessante, e seu domínio principal é exatamente aquele no qual estou interessado. Ele tem uma sintaxe simples e é fácil de ler. Não posso comentar mais no momento, mas depois de ler uma visão geral do Prolog e folhear algum material introdutório, ele classifica com (2). E parece que o retrocesso do Prolog está sempre sendo invadido por Haskell!
4) Das linguagens principais, Python parece a mais interessante. Tim Yates faz os idiomas parecerem muito atraentes. Aparentemente, Python é freqüentemente ensinado a alunos do primeiro ano em CS; portanto, é conceitualmente rico ou fácil de aprender. Eu teria que fazer mais pesquisas.
Obrigado a todos por suas recomendações! Parece que um Lisp (Scheme, Clojure), Prolog ou um assistente de prova como Coq ou Agda são os principais idiomas recomendados.