Qual é a linguagem de produção mais compatível e amplamente usada para exportar conhecimentos e habilidades adquiridos com a Haskell?

14

Eu gosto de Haskell, pura e simplesmente. Embora o Haskell seja usado em software de produção, ele não é especialmente amplamente implementado pelo que vi. Qual é a linguagem mais semelhante e ainda amplamente usada em relação aos projetos de produção, para que eu possa ter uma chance de usar uma coisa igualmente impressionante na indústria?

Também o mesmo idioma da primeira parte está disponível em um grande número de plataformas? Caso contrário, qual é a melhor alternativa que possui ampla implantação de plataforma? Eu gostaria que um único idioma fosse incluído na minha lista de tarefas, em vez de um enxame ou família em massa. Evidências concretas seriam uma vantagem.

Engenheiro Mundial
fonte

Respostas:

21

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.

CA McCann
fonte
Diz-se que o F # foi inspirado, se não derivado, do OCaml. Uma pergunta anterior do SO, F # e OCaml , aborda uma boa discussão sobre esse relacionamento. Se você está do lado .NET, o F # seria uma excelente opção e a Microsoft agora considera o F # uma linguagem .NET de "primeira classe". No lado da JVM, Scala tem um histórico de uso industrial e Clojure parece estar subindo nas paradas. No momento, não conheço nenhuma melhor opção, pois o mercado ainda não declarou um vencedor claro nesse espaço funcional de objetos.
John Tobler 1/1
4

Eu nunca o usei, mas às vezes vejo o Scala aparecendo em blogs ou descrições de projetos e acredito que foram necessários conceitos importantes de Haskell. O Scala é compilado na JVM e pode interoperar com Java.

Jürgen Strobel
fonte
3

Uma alternativa funcional é Erlang . Embora seja uma linguagem muito concorrente, o subconjunto seqüencial é uma linguagem funcional pura com muitas das propriedades das linguagens funcionais, por exemplo, fechamentos, dados imutáveis ​​e correspondência de padrões. Ele roda em muitas plataformas, incluindo linux, vários unixes, janelas e macosx. Agora existe até uma implementação na JVM, erjang . Ele pode se comunicar facilmente e coexistir com outros idiomas; é assim que é frequentemente usado.

Confira o site principal .

rvirding
fonte
3

O Clojure é cada vez mais utilizado e, embora não pareça Haskell em um nível superficial, se você parecer um pouco mais profundo, é claramente muito inspirado por Haskell e incentiva um estilo funcional muito semelhante.

Os principais recursos do Clojure que os usuários do Haskell podem achar familiares e atraentes:

  • A linguagem principal é puramente funcional - enquanto os efeitos colaterais são possíveis, eles são ocultados em locais específicos (por exemplo, referências STM, funções de IO, interoperabilidade Java)
  • Todas as estruturas de dados são imutáveis ​​e persistentes
  • Preguiça - alcançada em grande parte pelas onipresentes sequências preguiçosas de Clojure, isso parecerá muito familiar para os usuários Haskell. Sequências preguiçosas infinitas são boas.
  • Memória transacional de software - é a principal maneira de lidar com o estado mutável no Clojure. Vale a pena assistir a este excelente vídeo em que Rich Hickey explica a abordagem de Clojure à identidade e ao estado: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Principais diferenças (podem ser positivas ou negativas, dependendo da sua perspectiva):

  • É impuro - embora minha observação seja que o estilo idiomático de Clojure deve manter funções puras sempre que possível.
  • Digitação dinâmica em vez de estática (embora dicas de tipo estático possam ser usadas opcionalmente para otimizações de desempenho)
  • É um idioma da JVM com fácil acesso a todo o ecossistema da biblioteca Java - essa é, na minha opinião, a maior vantagem em termos de aplicabilidade no mundo real
  • Sintaxe Lisp. Então você obtém todos os benefícios da homoiconicidade , ao custo de ter que aprender a ver através de todos os parênteses :-)

Perspectiva pessoal: eu aprendi Haskell antes de Clojure e amei Haskell por sua elegância e pureza matemática. Clojure tira muita inspiração e empresta muitos recursos bons de Haskell, mas é um idioma muito mais pragmático / prático. Especialmente quando você conta o enorme valor de poder aproveitar o ecossistema da biblioteca Java, é uma ótima linguagem para "fazer as coisas".

Mikera
fonte
1

Se você gosta de Haskell, mas precisa criar código para a JVM, o frege pode ser interessante para você. Ele foi projetado para ser o mais próximo possível do Haskell 2010, mas gera código Java.

Obviamente, o frege em si não é nada como "linguagem de produção amplamente usada" (é publicada recentemente), mas o Java é certamente.

Ingo
fonte