web-dev-qa-db-fra.com

Haskell vs Erlang pour les services Web

Je cherche à démarrer un projet expérimental en utilisant un langage fonctionnel et j'essaie de décider entre Erlang et Haskell, et les deux ont des points que j'aime beaucoup.

J'aime le système de caractères forts et la pureté de Haskell. J'ai le sentiment que cela facilitera l'écriture de code vraiment fiable. Et je pense que le pouvoir de Haskell facilitera beaucoup ce que je veux faire.

Du côté négatif, j'ai l'impression que certains des cadres pour faire des trucs Web sur Haskell tels que Yesod ne sont pas aussi avancés que leurs homologues Erlang.

J'aime plutôt l'approche Erlang des threads et de la tolérance aux pannes. J'ai le sentiment que l'évolutivité d'Erlang pourrait être un atout majeur.

Ce qui m'amène à ma question, quelle a été l'expérience des gens dans la mise en œuvre de backends d'applications Web à la fois à Haskell et à Erlang. Existe-t-il des packages pour Haskell pour fournir certains des threads et acteurs légers que l'on a à Erlang?

29
Zachary K

La seule question que je me pose est: que fait votre service Web? Si le service Web est vraiment un problème fonctionnel, alors Haskell conviendra mieux.

Erlang n'est pas nécessairement un langage fonctionnel. C'est un langage procédural avec un modèle d'exécution très solide pour les systèmes massivement parallèles. Il a été conçu pour l'industrie des télécommunications et il conviendrait certainement parfaitement pour répondre aux demandes de services Web.

Voir cette page * pour un aperçu des différences entre la programmation procédurale et fonctionnelle. (Toutes mes excuses à l'avance pour le laid noir sur la page cyan).

Si votre service Web effectue une bonne quantité de correspondance de modèles et d'application de règles, Haskell est votre choix. Si vous voulez juste une infrastructure évolutive qui ne soit pas trop différente des langues que vous connaissez probablement déjà, choisissez Erlang.

(* lien via la machine Wayback. Le fichier d'origine a été supprimé)

19
Berin Loritsch

Entre les deux que vous mentionnez, Haskell est définitivement académique, tandis qu'Erlang est utilisé dans des projets réels à haute évolutivité. Donc, des deux pour les services Web, je choisirais Erlang.

Mais je dirais que vous avez un troisième choix: Scala , une langue fortement influencée par Haskell et Erlang. Il est utilisé pour créer des services Web de premier ordre comme Twitter ou Foursquare. Il y a même Lift , un framework web inspiré de Rails et Django, bien qu'avec approche un peu différente, plus fonctionnelle. Foursquare utilise Lift.

10
vartec

Habituellement, je dis: "apprenez des choses aussi loin que possible de votre zone de confort, cela fera de vous un meilleur programmeur même si vous ne l'utilisez jamais en pratique".

Dans ce cas, cela pourrait probablement signifier Haskell; mais Erlang devient non seulement presque socialement acceptable; mais les principaux points (processus légers, transmission de messages, grande évolutivité) arrivent sur de nombreuses autres plates-formes "pratiques", de sorte que les leçons apprises ont une applicabilité importante et immédiate sur des travaux plus "réels".

mon conseil: si c'est pour le plaisir, faites Haskell. si c'est pour l'entraînement, allez Erlang.

6
Javier

Haskell (GHC) a une prise en charge prête à l'emploi pour les fils verts (les "processus" d'Erlang). Par exemple, forkIO génère un nouveau thread vert et renvoie son identifiant de thread.

forkIO :: IO () -> IO ThreadId

le mécanisme de passage des messages est implémenté par le paquet processus-distribué mais il n'est pas très bien maintenu.
Le mécanisme de partage de données de Haskell diffère d'Erlang. Haskell embrasse l'idée d'états globaux mutables et a ajouté des abstractions pour le rendre sûr à utiliser. TVar ( [~ # ~] t [~ # ~] ransactioal Var iable) qui permet transactions atomiques composables .
Haskell possède également des bibliothèques de services Web de très haut niveau qui utilisent son système de type expressif (types dépendants), par exemple, servant. Il vous permet de spécifier votre REST API en utilisant DSL au niveau du type qui peut être utilisé au moment de la compilation pour assurer la sécurité du type.

Éditer:
apparemment distribué-fermeture implémente également la sérialisation de fermeture avec l'aide de staticptr

1
Poscat

Vous pouvez également envisager Rust .

  • Il n'est pas purement fonctionnel, mais il encourage un style semi-fonctionnel
    • Fermetures
    • Immuabilité par défaut
    • Il a un système de macro solide et sûr, vous permettant d'écrire des macros (ou d'utiliser celles existantes créées par la communauté) pour écrire du code dans un style plus fonctionnel
  • Il a des bibliothèques/frameworks pour chaque niveau d'abstraction
  • Il met fortement l'accent sur la sécurité de la mémoire efficace
  • Il a un système de type fort
  • Cela rend toutes sortes de simultanéités très faciles (tant que vous répondez à toutes les exigences de sécurité)
  • Il a une grande communauté active
  • Il est open-source (comme les autres que vous avez mentionnés)
  • etc.
0
Solomon Ucko