Estou pensando em mergulhar em Haskell para o meu próximo projeto pessoal (relativamente trivial). As razões pelas quais estou abordando Haskell são:
- Coloque minha cabeça em uma linguagem puramente funcional
- Rapidez. Embora eu tenha certeza de que isso pode ser discutido, o perfil de que eu vi unhas Haskell perto de C ++ (e parece ser um pouco mais rápido que Erlang).
- Rapidez. O servidor da Web Warp parece estar louco rapidamente em comparação com praticamente todo o resto .
Então, considerando isso, o que estou procurando são as desvantagens ou problemas que acompanham Haskell. A web tem uma quantidade enorme de informações sobre por que Haskell é uma coisa boa, mas eu não encontrei muitos tópicos sobre seu lado feio (além de queixas sobre sua sintaxe com a qual eu não me importo).
Um exemplo do que estou procurando pode ser o GIL do Python. Algo que não se destacou até eu realmente começar a usar a simultaneidade em um ambiente CPython.
Respostas:
Algumas desvantagens que posso pensar:
fonte
A maioria das desvantagens de Haskell (assim como a maior parte da parte superior de Haskell) vem de suas duas características definidoras: é preguiçoso e puramente funcional.
Ser preguiçoso torna mais difícil argumentar sobre desempenho. Especialmente para pessoas que não estão acostumadas à preguiça, mas mesmo para Haskellers experientes, pode ser difícil ver como a preguiça afetará o desempenho em certos casos.
Preguiça também significa que é mais difícil criar benchmarks precisos sem usar bibliotecas como o Critério.
Ser puramente funcional significa que sempre que você precisar usar estruturas de dados mutáveis (nos casos em que não é possível obter o desempenho desejado sem elas - embora graças ao otimizador do GHC que não ocorra com a frequência que você imagina), você estará preso na mônada IO (ou ST), o que torna o código mais complicado.
Como você mencionou a velocidade como um dos seus objetivos, devo salientar que muitas vezes há grandes diferenças no desempenho entre o código Haskell otimizado para a mão e o código Haskell que foram escritos sem pensar muito no desempenho (mais do que em outros idiomas). E o código Haskell otimizado para as mãos é geralmente bastante feio (embora eu suponha que isso também seja verdade na maioria dos outros idiomas).
fonte
Não sou especialista em Haskell: aprendi o básico, mas infelizmente não tive a chance de fazer um projeto sério em Haskell (eu gostaria, porém, porque gosto muito desse idioma).
No entanto, pelo que sei e por uma discussão com alguém que trabalha em um campo bastante próximo da programação funcional, Haskell pode não ser a melhor solução quando você deseja implementar algoritmos de gráficos, onde você precisa, por exemplo, percorrer o gráfico e executar muitas mudanças locais na estrutura do gráfico.
Como um gráfico não possui uma estrutura recursiva em geral, minha opinião é que a melhor abordagem é criar uma cópia do gráfico usando estruturas e ponteiros entre elas (como é possível, por exemplo, em C ++) e manipular essa cópia alterando os ponteiros, criando ou destruindo nós e assim por diante.
Gostaria de saber como essas estruturas e operações de dados podem ser tratadas adequadamente em Haskell, pois, para meu conhecimento em Haskell, não é possível usar a representação / abordagem acima. Alguns problemas com algoritmos de gráfico em Haskell são discutidos brevemente neste artigo
EDITAR
Recentemente, conversei com um especialista em programação funcional e ele confirmou que a implementação eficiente de certos algoritmos de gráficos pode ser bastante complicada em Haskell: mover ponteiros como você faz em C ou C ++ pode ser muito mais rápido.
fonte
O lado ruim de Haskell é que é diferente. É um passo maior em relação aos idiomas que são mais ensinados ou comentados, por isso haverá uma curva de aprendizado maior. Também é menos popular em um idioma que pode limitar a disponibilidade de ajuda se você ficar preso. Essas realmente não são grandes desvantagens.
A única coisa que é uma desvantagem potencial é que é uma linguagem funcional, portanto é menos útil para determinados domínios de problemas, mas isso também é válido para linguagens orientadas a objetos. Geralmente, os idiomas não têm negativos verdadeiros além das curvas de aprendizado, pelo menos para os idiomas relativamente populares. Enquanto uma língua é Turing completa, ela é teoricamente capaz de qualquer coisa.
fonte
Os "problemas com Haskell" tendem a aparecer em determinados domínios. Haskell é uma linguagem maravilhosa para programação de aplicativos, muito mais agradável de escrever do que qualquer outra coisa. Os problemas tendem a surgir quando você tenta fazer algo para o qual não há um bom suporte, como:
fonte