const
puede ser solo la implementación que está buscando junto con otras funciones. Aquí hay un ejemplo que descubrí.
Digamos que queremos reescribir una estructura de 2-tuplas a otra estructura de 2-tuplas. Yo podría expresar esto como tan:
((a,b),(c,d)) ⇒ (a,(c,(5,a)))
me puede dar una definición recta hacia adelante con la coincidencia de modelos:
f ((a,b),(c,d)) = (a,(c,(5,a)))
¿Y si quiero una solución inútil (tácito) para este tipo de reescrituras? Al pensar y manipular más tarde, la respuesta es que podemos expresar cualquier reescritura con (&&&), const, (.), fst, snd
. Tenga en cuenta que (&&&)
es de Control.Arrow
.
La solución del ejemplo usando estas funciones es:
(fst.fst &&& (fst.snd &&& (const 5 &&& fst.fst)))
Nota la similitud con (a,(c,(5,a)))
. ¿Qué pasa si reemplazamos &&&
con ,
? A continuación, se lee:
(fst.fst, (fst.snd, (const 5, fst.fst)))
Observe cómo a
es el primer elemento del primer elemento, y eso es lo fst.fst
proyectos. Observe cómo c
es el primer elemento del segundo elemento, y eso es lo que proyecta fst.snd
. Es decir, las variables se convierten en el camino hacia su origen.
const
nos permite introducir constantes. ¡Es interesante cómo el nombre se alinea con el significado!
entonces generalizar esta idea con Aplicativo para que pueda escribir cualquier función en un estilo sin sentido (siempre y cuando tenga el análisis de casos disponibles como funciones, tales como maybe
, either
, bool
). Nuevamente, const
juega el rol de introducir constantes. Puede ver este trabajo en el paquete Data.Function.Tacit.
Cuando empiezas de manera abstracta, en el objetivo y luego trabajas hacia una implementación, puedes sorprenderte con las respuestas. Es decir, cualquier función puede ser tan misteriosa como cualquier diente en una máquina. Sin embargo, si se retira para ver toda la máquina, puede comprender el contexto en el que es necesario.
Un ejemplo: 'backgroundColor :: Texto -> Color' es para mí' backgroundColor = const White' – Zhen