J'aime penser que les flèches, comme les monades et les foncteurs, permettent au programmeur de créer des compositions de fonctions exotiques.
Sans monades ni flèches (ni foncteurs), la composition de fonctions dans un langage fonctionnel est limitée à l'application d'une fonction au résultat d'une autre fonction. Avec les monades et les foncteurs, vous pouvez définir deux fonctions, puis écrire un code réutilisable séparé qui spécifie comment ces fonctions, dans le contexte de la monade particulière, interagissent les unes avec les autres et avec les données qui y sont transmises. Ce code est placé dans le code de liaison de la Monad. Ainsi, une monade est une vue unique, juste un conteneur pour un code de liaison réutilisable. Les fonctions se composent différemment dans le contexte d'une monade d'une autre monade.
Un exemple simple est la monade Maybe, où la fonction bind contient du code tel que si une fonction A est composée d'une fonction B dans une monade Maybe et que B produit un Nothing, le code de liaison assurera que la composition du deux fonctions produisent un Nothing, sans prendre la peine d'appliquer A à la valeur Nothing qui sort de B. S'il n'y avait pas de monade, le programmeur devrait écrire du code dans A pour tester une entrée Nothing.
Monads signifie également que le programmeur n'a pas besoin de saisir explicitement les paramètres requis par chaque fonction dans le code source - la fonction bind gère le passage des paramètres. Donc, en utilisant des monades, le code source peut commencer à ressembler davantage à une chaîne statique de noms de fonctions, plutôt que de ressembler à la fonction A "appelle" la fonction B avec les paramètres C et D - le code commence à ressembler davantage à un circuit électronique qu'à un circuit électronique. machine en mouvement - plus fonctionnelle que l'impératif.
Les flèches connectent également des fonctions avec une fonction de liaison, fournissant des fonctionnalités réutilisables et masquant des paramètres. Mais les flèches peuvent elles-mêmes être connectées et composées, et peuvent éventuellement acheminer des données vers d'autres flèches lors de l'exécution. Maintenant, vous pouvez appliquer des données à deux chemins de flèches, qui "font des choses différentes" pour les données et réassembler le résultat. Vous pouvez également sélectionner la branche des flèches vers laquelle transmettre les données, en fonction de la valeur des données. Le code qui en résulte ressemble encore plus à un circuit électronique, avec des commutateurs, des retards, une intégration, etc. Le programme semble très statique et vous ne devriez pas être en mesure de voir beaucoup de manipulations de données. Il y a de moins en moins de paramètres à prendre en compte, et moins besoin de penser aux valeurs que les paramètres peuvent prendre ou non.
Écrire un programme Arrowized implique principalement de sélectionner des flèches standard telles que des séparateurs, des commutateurs, des retards et des intégrateurs, de lever des fonctions dans ces flèches et de relier les flèches ensemble pour former des flèches plus grosses. Dans la programmation réactive fonctionnelle fléchée, les flèches forment une boucle, les entrées du monde étant combinées aux sorties de la dernière itération du programme, de sorte que les sorties réagissent aux entrées du monde réel.
Le temps est l'une des valeurs du monde réel. Dans Yampa, la flèche de fonction de signal insère de manière invisible le paramètre de temps dans le programme. Vous n’accédez jamais à la valeur de temps, mais si vous connectez une flèche d’intégrateur au programme, elle affichera des valeurs intégrées au fil du temps que vous pourrez ensuite utiliser pour passer à. autres flèches.