J'envisage de plonger dans Haskell pour mon prochain projet personnel (relativement trivial). Les raisons pour lesquelles je m'attaque à Haskell sont:
Donc, étant donné cela, ce que je recherche, ce sont les inconvénients ou les problèmes qui accompagnent Haskell. Le Web contient énormément d'informations sur les raisons pour lesquelles Haskell est une bonne chose, mais je n'ai pas trouvé beaucoup de sujets sur son côté laid (à part les reproches sur sa syntaxe dont je ne me soucie pas du tout).
Un exemple de ce que je recherche pourrait être le GIL de Python. Quelque chose qui n'a pas fait son apparition jusqu'à ce que je commence vraiment à chercher à utiliser la concurrence dans un environnement CPython.
Quelques inconvénients auxquels je peux penser:
La plupart des inconvénients de Haskell (ainsi que la plupart des avantages de Haskell) proviennent de ses deux caractéristiques déterminantes: il est paresseux et purement fonctionnel.
Être paresseux, il est plus difficile de raisonner sur les performances. Surtout pour les personnes non habituées à la paresse, mais même pour les Haskellers expérimentés, il peut être difficile de voir comment la paresse affectera les performances dans certains cas.
La paresse signifie également qu'il est plus difficile de créer des repères précis sans utiliser des bibliothèques comme Criterion.
Être purement fonctionnel signifie que chaque fois que vous devez utiliser des structures de données mutables (dans les cas où il n'est pas possible d'atteindre les performances souhaitées sans elles - bien que grâce à l'optimiseur de GHC qui ne se produit pas aussi souvent que vous le pensez), vous serez coincé dans la monade IO (ou ST), ce qui rend le code plus lourd.
Puisque vous avez mentionné la vitesse comme l'un de vos objectifs, je dois souligner qu'il existe souvent d'énormes différences de performances entre le code Haskell optimisé à la main et le code Haskell qui a été écrit sans trop réfléchir aux performances (plus que dans d'autres langues). Et le code Haskell optimisé à la main est souvent assez moche (bien que je suppose que cela soit également vrai dans la plupart des autres langues).
Je ne suis pas un expert Haskell: j'ai appris les bases mais malheureusement je n'ai pas eu la chance de faire un projet sérieux à Haskell (j'aimerais bien, car j'aime beaucoup cette langue).
Cependant, d'après ce que je sais et d'une discussion avec quelqu'un qui a travaillé dans un domaine assez proche de la programmation fonctionnelle, Haskell n'est peut-être pas la meilleure solution lorsque vous souhaitez implémenter des algorithmes graphiques, où vous avez besoin par exemple pour parcourir le graphique et effectuer de nombreux changements locaux sur la structure du graphique.
Puisqu'un graphique n'a pas de structure récursive en général, mon sentiment est que la meilleure approche est de construire une copie du graphique en utilisant des structures et des pointeurs entre eux (comme vous pouvez le faire par exemple en C++) et de manipuler cette copie en changeant de pointeurs, créer ou détruire des nœuds, etc.
Je me demande comment ces structures de données et ces opérations peuvent être gérées correctement dans Haskell, car à ma connaissance dans Haskell, il n'est pas possible d'utiliser la représentation/approche ci-dessus. Certains problèmes avec les algorithmes de graphes dans Haskell sont brièvement discutés dans cet article
[~ # ~] modifier [~ # ~]
J'ai récemment parlé à un expert de la programmation fonctionnelle et il a confirmé que la mise en œuvre efficace de certains algorithmes de graphe peut être assez délicate dans Haskell: se déplacer parmi les pointeurs comme vous le faites en C ou C++ peut être beaucoup plus rapide.
L'inconvénient de Haskell est que c'est différent. C'est un pas de plus par rapport aux langues qui sont le plus souvent enseignées ou parlées, il y aura donc une courbe d'apprentissage plus longue. Il est également moins populaire d'une langue qui peut limiter la disponibilité de l'aide si vous êtes bloqué. Ce ne sont vraiment pas des inconvénients majeurs.
La seule chose qui est un inconvénient potentiel est qu'il s'agit d'un langage fonctionnel, il est donc moins utile pour certains domaines problématiques, mais cela est également vrai pour les langages orientés objet. Généralement, les langues n'ont pas de vrais négatifs au-delà des courbes d'apprentissage, du moins pour les langues relativement populaires. Tant qu'un langage est Turing complet, il est théoriquement capable de tout.
Donc, étant donné cela, ce que je recherche, ce sont les inconvénients ou les problèmes qui accompagnent Haskell
Les "problèmes avec Haskell" ont tendance à apparaître dans certains domaines. Haskell est un langage merveilleux pour la programmation d'applications, beaucoup plus agréable à écrire que n'importe quoi d'autre. Les problèmes ont tendance à surgir lorsque vous essayez de faire quelque chose pour lequel il n'y a pas un bon soutien, comme: