Haskell está mais intimamente relacionado à família de idiomas ML. Isso inclui coisas como OCaml , é claro, mas também F # na plataforma .NET. Essas linguagens compartilham com Haskell a base do sistema de tipos e como os dados são usados - tipos de dados algébricos, correspondência de padrões, inferência de tipos etc. Eles podem diferir substancialmente de Haskell em outros pontos, é claro - a maioria dos MLs é rígida e impura , para começar, e a popularidade de Haskell como veículo para pesquisa em sistemas de tipos e design de idiomas significa que a maioria das linguagens no estilo ML tendem a ter sistemas do tipo menos poderosos (mas potencialmente mais fáceis de entender). Provavelmente é seguro dizer que, embora você possa sentir faltaalgumas coisas sobre Haskell, particularmente no início, a maioria dos programadores de Haskell provavelmente se sentiria confortavelmente em casa em um ML muito rapidamente, em um nível básico de fazer as coisas. Se você quer um idioma com a mesma estrutura geral que Haskell, um ML é sua melhor aposta.
O lado funcional do Scalatambém se apóia fortemente na tradição da ML e também traz alguns recursos avançados do sistema de tipo familiar da Haskell, além de um sistema OOP mais padrão integrado ao descrito acima. Enquanto o OO em linguagens no estilo ML tende a ser abordado como mais um "modelo OO com ferramentas funcionais básicas" Scala vive e respira OO no estilo Java. Isso traz benefícios para a interoperabilidade Java, como você pode imaginar, e apresenta um ambiente de trabalho mais familiar para os programadores de OO. No entanto, vindo de um plano de fundo Haskell, é mais provável que você fique irritado com as maneiras pelas quais as coisas combinadas no Scala tornam os idiomas funcionais desajeitados e ache a maioria das APIs Java mal projetadas e desnecessariamente difíceis de usar.
Finalmente, embora possa parecer estranho considerar, Clojure realmente tem muitas coisas em comum com Haskell em um nível mais filosófico. A maior parte do que você encontrará na abordagem de Clojure de estado e valores versus identidades está muito próxima do que Haskell formaliza através do sistema de tipos. Do mesmo modo, Clojure enfatiza a interoperabilidade Java em um grau menor e não se preocupa tanto em arrastar no OOP; portanto, de alguma maneira, a abordagem do Clojure à programação funcional em si pode estar mais próxima do que você já conhece. Eu acho que é revelador a esse respeito que, até onde eu sei, Clojure é a única linguagem além de Haskell que possui uma implementação do STMisso é simples, eficaz e simplesmente funciona. Por outro lado, Clojure vem da tradição Lisp e, portanto, carece do sistema de tipos estático e da ênfase nos tipos de dados algébricos e na correspondência de padrões encontrados nas linguagens influenciadas por ML. E é claro que é um Lisp, que é negativo para algumas pessoas (embora eu realmente não saiba o porquê).
Falando por mim, com o aviso de que minha primeira experiência com programação funcional foi em Scheme, eu provavelmente me inclinaria para Clojure, com OCaml como uma segunda opção provável.