Je suis principalement un programmeur C / C ++, ce qui signifie que la majorité de mon expérience concerne les paradigmes procéduraux et orientés objet. Cependant, comme de nombreux programmeurs C ++ le savent, C ++ s'est déplacé au fil des ans vers un style fonctionnel, aboutissant finalement à l'ajout de lambdas et de fermetures en C ++ 0x.
Quoi qu'il en soit, même si j'ai une expérience considérable dans le codage dans un style fonctionnel utilisant C ++, je n'ai que très peu d'expérience avec les langages fonctionnels réels tels que Lisp, Haskell, etc.
J'ai récemment commencé à étudier ces langages, car l'idée de "pas d'effets secondaires" dans les langages purement fonctionnels m'a toujours intrigué, notamment en ce qui concerne ses applications à la concurrence et à l'informatique distribuée.
Cependant, venant d'un arrière-plan C ++, je suis confus quant à la façon dont cette philsophie "sans effets secondaires" fonctionne avec la programmation asynchrone. Par programmation asynchrone, j'entends tout cadre / API / style de codage qui envoie des gestionnaires d'événements fournis par l'utilisateur pour gérer les événements qui se produisent de manière asynchrone (en dehors du flux du programme). Cela inclut les bibliothèques asynchrones telles que Boost.ASIO, ou même tout simplement le vieux C gestionnaires de signaux ou gestionnaires d'événements Java GUI.
La seule chose que tous ces éléments ont en commun est que la nature de la programmation asynchrone semble nécessiter la création d'effets secondaires (état), afin que le flux principal du programme prenne conscience qu'un gestionnaire d'événements asynchrone a été invoqué. En règle générale, dans un cadre comme Boost.ASIO, un gestionnaire d'événements modifie l'état d'un objet, de sorte que l'effet de l'événement se propage au-delà de la durée de vie de la fonction de gestionnaire d'événements. Vraiment, que peut faire d'autre un gestionnaire d'événements? Il ne peut pas "renvoyer" une valeur au point d'appel, car il n'y a pas de point d'appel. Le gestionnaire d'événements ne fait pas partie du flux principal du programme, donc la seule façon dont il peut avoir un effet sur le programme réel est de changer un état (ou bien longjmp
un autre point d'exécution).
Il semble donc que la programmation asynchrone consiste à produire des effets secondaires de manière asynchrone. Cela semble totalement contraire aux objectifs de la programmation fonctionnelle. Comment ces deux paradigmes sont-ils conciliés (en pratique) dans les langages fonctionnels?