Existem desvantagens ou problemas com o Haskell?

47

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:

  1. Coloque minha cabeça em uma linguagem puramente funcional
  2. 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).
  3. 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.

Demian Brecht
fonte
4
Encontrei isso no stackoverflow: stackoverflow.com/questions/1695076/pros-and-cons-of-haskell
FrustratedWithFormsDesigner
26
Ouvi dizer que programadores menores lidaram com problemas de derretimento cerebral. É uma condição muito cara para tratar.
precisa saber é o seguinte
1
@FrustratedWithFormsDesigner: Obrigado pelo link. No entanto, ainda não há nenhuma referência a desvantagens técnicas de Haskell. Será que não nenhuma? ;)
Demian Brecht
6
@ChaosPandion: Eu ouvi o mesmo. Mas se você não está derretendo seu cérebro, está realmente tentando ? ;) Além disso, eu realmente não me consideraria um programador menor, por isso não estou muito preocupado com isso;) #
699 Demian Brecht
3
@ChaosPandion: E a maioria dos planos de saúde não cobre isso. :(
FrustratedWithFormsDesigner

Respostas:

48

Algumas desvantagens que posso pensar:

  • Devido à natureza da linguagem e suas raízes firmes no mundo acadêmico, a comunidade tem uma mente muito matemática; se você é uma pessoa pragmática, às vezes isso pode ser esmagador; se você não falar o jargão, terá mais dificuldade do que em muitos outros idiomas.
  • Embora exista uma riqueza incrível de bibliotecas, a documentação geralmente é concisa.
  • Os tutoriais de nível básico são poucos e difíceis de encontrar, portanto a curva de aprendizado inicial é bastante acentuada.
  • Alguns recursos de idioma são desnecessariamente desajeitados; um exemplo proeminente é como a sintaxe do registro não introduz um escopo de nomenclatura; portanto, não há como ter o mesmo nome de campo de registro em dois tipos diferentes no mesmo espaço de nome do módulo.
  • O padrão de Haskell é a avaliação preguiçosa e, embora isso geralmente seja ótimo, às vezes você pode mordê-lo de maneiras desagradáveis. Usar a avaliação preguiçosa ingenuamente em situações não triviais pode levar a gargalos desnecessários no desempenho, e entender o que está acontecendo sob o capô não é exatamente simples.
  • A avaliação preguiçosa (especialmente combinada com pureza e um compilador agressivamente otimizado) também significa que você não pode raciocinar facilmente sobre a ordem de execução; de fato, você nem sabe se um determinado pedaço de código é avaliado em uma determinada situação. Conseqüentemente, a depuração do código Haskell requer uma mentalidade diferente, apenas porque o passo a passo no código é menos útil e menos significativo.
  • Por causa da pureza de Haskell, você não pode usar efeitos colaterais para fazer coisas como E / S; é necessário usar uma avaliação preguiçosa da mônada e 'abusar' para obter interatividade e arrastar o contexto monádico para qualquer lugar em que você queira fazer E / S. (Na verdade, esse é um bom recurso de várias maneiras, mas às vezes impossibilita a codificação pragmática.)
tdammers
fonte
16
Na verdade, existem alguns livros introdutórios muito bons disponíveis gratuitamente on-line agora. Aprenda um Haskell para o Grande Bem é um dos melhores livros de programação para iniciantes que eu já li e o Mundo Real Haskell é um ótimo recurso intermediário.
Tikhon Jelvis
1
@TikhonJelvis: Esses são realmente os únicos dois candidatos que achei valiosos em usar; "Learn You A Haskell" me confundiu mais do que tudo, "Real World Haskell" funcionou para mim, mas assume um pouco de experiência em programação. Há também "Introdução suave a Haskell", mas é tudo menos delicado, especialmente se você não tem experiência em matemática.
tdammers
Eu uso "Gentle Introduction to Haskell" e "Real World Haskell". A combinação dos dois me deu muitas informações úteis. Estou em um nível em que estou pronto para um projeto não trivial, mas infelizmente não tenho muito tempo para isso.
Giorgio
9
"se você é uma pessoa pragmática ...": às vezes, usar uma linguagem orientada à matemática pode ser uma decisão muito pragmática, se evitar muitas correções de erros mais tarde. Obviamente, você sempre deve encontrar um equilíbrio entre quanto tempo economiza usando uma ferramenta e quanto tempo extra precisa para aprender a usá-la.
Giorgio
Mônadas (e funcionam em outros idiomas) funcionam exatamente da mesma maneira em um idioma estrito. Você absolutamente não "abuse" da avaliação preguiçosa para obter interatividade, é trivial escrever um programa interativo estrito em Haskell.
ponto
19

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).

sepp2k
fonte
1
Puramente funcional é realmente um recurso de venda, não uma desvantagem. Uma linguagem que é "preguiçosa" não faz sentido, preguiçoso versus estrito é uma questão de tipos, e os tipos preguiçoso e estrito têm seus usos. (Portanto, Haskell é tão aleijado por não ter tipos estritos quanto a maioria das linguagens é aleijado por não ter tipos preguiçosos.) As principais desvantagens de Haskell são seu sistema de módulo de baixa qualidade (os módulos não são de primeira classe) e as classes de tipo de fato quebram a modularidade (o A regra "uma instância por tipo" força o compilador a manter uma lista global de instâncias de classe de tipo).
precisa
21
"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)." Este. Quando as pessoas querem mostrar a elegância de Haskell, elas publicam códigos curtos e agradáveis, que infelizmente oferecem desempenho muito ruim se executados em uma quantidade de dados semelhante à produção. Quando as pessoas querem mostrar que "Haskell é tão rápido como C ++", eles publicam complicado e difícil de ler o código, que ainda mais lento é do que uma versão muito mais legível em C.
quant_dev
12

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.

Giorgio
fonte
Notas interessantes (e link) sobre manipulação / travessia de gráficos em um mundo funcional puro. Não tinha considerado isso.
Demian Brecht
7
Algoritmos de gráficos puramente funcionais são um tópico interessante. A solução idiomática é emular a representação imperativa substituindo ponteiros por dicionários puramente funcionais, por exemplo, mapeando um determinado vértice para o conjunto de vértices aos quais ele possui bordas. No entanto, a menos que um dicionário fraco seja usado, isso vazará memória, porque subgráficos inacessíveis não podem ser coletados e não há um dicionário fraco puramente funcional conhecido. No final do dia, uma solução puramente funcional de última geração é muito mais complicada e muito menos eficiente!
Jon Harrop
1
Por outro lado, algoritmos de grafos pode ser notoriamente difícil de depurar e estrutura de dados persistente pode aliviar este problema ...
Jon Harrop
Eu queria saber se seria possível desenvolver um tipo de dados de gráfico (seguindo a idéia de ByteString: representação interna eficiente mais funções de conversão / acesso). Usando mônadas, deve ser possível tornar esses gráficos mutáveis. Obviamente, isso abordaria a questão de representar gráficos, mas não a de implementar algoritmos de gráficos.
Giorgio
DAGs são uma coisa. Para todo o resto, você pode explorar a preguiça e "dar um nó".
Danielm 5/10
4

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.

Ryathal
fonte
3
A perfeição de Turing é um arenque vermelho. Teoria da computação! = Programação prática.
1
@delnan por isso eu disse teoricamente
Ryathal
2
Quais são esses "domínios problemáticos" para os quais Haskell é supostamente menos útil?
Andrés F.
3
Embora seja verdade que a comunidade é menor , na verdade é desproporcionalmente ativa. Eu acho que o canal #haskell na freenode é atrás apenas #python em popularidade dentro dos canais de língua, e respondendo perguntas sobre Haskell no SO é surpreendentemente competitivo :)
Tikhon Jelvis
@AndresF. - Eu não chegaria ao ponto de dizer "menos útil", mas aqui estão algumas áreas em que Haskell definitivamente ainda mostra sua infância: 1) DP pesado - eu codifiquei um algoritmo simples de mochila e fiquei literalmente chocado com a forma como devagar foi. Isso estava usando matrizes in a box, então eu esperava alguma sobrecarga, mas foi muito pior do que eu previa. 2) grandes jogos não triviais - o AFRP está em sua infância, portanto não há estruturas particularmente boas e o desempenho ainda é muito difícil de prever. Vai demorar muito até vermos a versão Haskell do Doom. (frag não conta - não tem AI.)
rtperson
0

Então, considerando isso, o que estou procurando são as desvantagens ou problemas que acompanham Haskell

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:

  • Compilação cruzada. O GHC pode ser construído como um compilador cruzado, mas o processo está bastante envolvido.
  • Aplicativos incorporados. Haskell possui gerenciamento de memória por meio de um coletor de lixo, portanto este não é muito surpreendente.
  • Rapidez. Haskell não é tão rápido quanto Rust, embora na maioria dos casos ele concorra bastante bem. Depende muito do domínio do aplicativo - cálculos puros são otimizados bem, mas algo como "leia um arquivo em um buffer e conte o número de linhas" é mais difícil de expressar em Haskell.

fonte