const
peut être simplement l'implémentation que vous recherchez en conjonction avec d'autres fonctions. Voici un exemple que j'ai découvert.
Disons que nous voulons réécrire une structure de 2-tuples en une autre structure de 2-tuples. Je pourrais l'exprimer ainsi:
((a,b),(c,d)) ⇒ (a,(c,(5,a)))
Je peux donner une définition simple avec la correspondance de motifs:
f ((a,b),(c,d)) = (a,(c,(5,a)))
Et si je veux une solution inutile (tacite) pour ce genre de réécritures? Un peu de réflexion et de bidouillage plus tard, la réponse est que nous pouvons exprimer toutes les réécritures avec (&&&), const, (.), fst, snd
. Notez que (&&&)
c'est de Control.Arrow
.
La solution de l'exemple utilisant ces fonctions est:
(fst.fst &&& (fst.snd &&& (const 5 &&& fst.fst)))
Notez la similitude avec (a,(c,(5,a)))
. Et si on remplace &&&
par ,
? Ensuite, il lit:
(fst.fst, (fst.snd, (const 5, fst.fst)))
Remarquez comment a
est le premier élément du premier élément, et c'est ce que les fst.fst
projets. Remarquez comment c
est le premier élément du deuxième élément, et c'est ce que les fst.snd
projets. Autrement dit, les variables deviennent le chemin vers leur source.
const
nous permet d'introduire des constantes. Intéressant comment le nom s'aligne avec le sens!
Je puis généralisé cette idée avec Applicative de sorte que vous pouvez écrire une fonction dans un style inutile (tant que vous avez une analyse de cas disponible en fonctions, telles que maybe
, either
, bool
). Encore une fois, const
joue le rôle d'introduire des constantes. Vous pouvez voir ce travail dans le package Data.Function.Tacit .
Lorsque vous commencez de manière abstraite, à l'objectif, puis que vous travaillez vers une implémentation, vous pouvez être surpris par les réponses. C'est-à-dire qu'une fonction peut être aussi mystérieuse que n'importe quel rouage d'une machine. Cependant, si vous reculez pour faire apparaître la machine entière, vous pouvez comprendre le contexte dans lequel ce rouage est nécessaire.
backgroundColor :: Text -> Color
est pour moibackgroundColor = const White