Me gusta pensar que las Flechas, como Mónadas y Functores, permiten que el programador haga composiciones exóticas de funciones.
Sin Mónadas o Flechas (y Functores), la composición de funciones en un lenguaje funcional se limita a aplicar una función al resultado de otra función. Con las mónadas y los functores, puede definir dos funciones y luego escribir un código reutilizable separado que especifique cómo esas funciones, en el contexto de la mónada en particular, interactúan entre sí y con los datos que se pasan a ellas. Este código se coloca dentro del código de enlace de la Mónada. Entonces, una mónada es una vista única, solo un contenedor para código de enlace reutilizable. Las funciones se componen de manera diferente dentro del contexto de una mónada de otra mónada.
Un ejemplo simple es la mónada tal vez, donde hay un código en la función de enlace, de modo que si una función A está compuesta con una función B dentro de una mónada tal, y B produce una nada, entonces el código de enlace garantizará que la composición de la dos funciones generan un Nothing, sin molestarse en aplicar A al valor Nothing que sale de B. Si no hubiera mónada, el programador tendría que escribir el código en A para probar una entrada Nothing.
Las mónadas también significan que el programador no necesita escribir explícitamente los parámetros que cada función requiere en el código fuente; la función de enlace maneja el paso de parámetros. Entonces, usando mónadas, el código fuente puede comenzar a parecerse más a una cadena estática de nombres de funciones, en lugar de parecer que la función A "llama" a la función B con los parámetros C y D: el código comienza a sentirse más como un circuito electrónico que como un máquina móvil: más funcional que imperativa.
Las flechas también conectan funciones junto con una función de enlace, proporcionando funcionalidad reutilizable y ocultando parámetros. Pero las Flechas pueden conectarse y componerse, y opcionalmente pueden enrutar datos a otras Flechas en tiempo de ejecución. Ahora puede aplicar datos a dos rutas de flechas, que "hacen cosas diferentes" a los datos, y volver a ensamblar el resultado. O puede seleccionar a qué rama de Flechas pasar los datos, dependiendo de algún valor en los datos. El código resultante se parece aún más a un circuito electrónico, con interruptores, retrasos, integración, etc. El programa se ve muy estático y no debería poder ver mucha manipulación de datos. Hay cada vez menos parámetros en los que pensar, y menos necesidad de pensar en qué valores pueden o no tomar los parámetros.
Escribir un programa Arrowized implica principalmente seleccionar las flechas disponibles en el estante, como divisores, interruptores, retrasos e integradores, levantar funciones en esas flechas y conectar las flechas para formar flechas más grandes. En la programación reactiva funcional con flechas, las flechas forman un bucle, con la entrada del mundo combinada con la salida de la última iteración del programa, de modo que la salida reacciona a la entrada del mundo real.
Uno de los valores del mundo real es el tiempo. En Yampa, la flecha de la función de señal envía el parámetro de tiempo de forma invisible a través del programa de computadora: nunca se accede al valor de tiempo, pero si conecta una flecha integradora al programa, generará valores integrados a lo largo del tiempo que luego puede usar para pasar a otras flechas