const
potrebbe essere proprio l'implementazione che stai cercando in combinazione con altre funzioni. Ecco un esempio che ho scoperto.
Supponiamo di voler riscrivere una struttura di 2 tuple in un'altra struttura di 2 tuple. Potrei esprimere questo come modo:
((a,b),(c,d)) ⇒ (a,(c,(5,a)))
posso dare una definizione straight-forward con pattern matching:
f ((a,b),(c,d)) = (a,(c,(5,a)))
Cosa succede se voglio una soluzione inutile (tacita) per questo tipo di riscritture? Alcuni pensano e giocherellano più tardi, la risposta è che possiamo esprimere qualsiasi riscrittura con (&&&), const, (.), fst, snd
. Si noti che (&&&)
è da Control.Arrow
.
La soluzione dell'esempio utilizzando queste funzioni è:
(fst.fst &&& (fst.snd &&& (const 5 &&& fst.fst)))
Nota la somiglianza con (a,(c,(5,a)))
. Cosa succede se sostituiamo &&&
con ,
? Poi si legge:
(fst.fst, (fst.snd, (const 5, fst.fst)))
Notate come a
è il primo elemento del primo elemento, e questo è ciò che fst.fst
progetti. Nota come c
è il primo elemento del secondo elemento, ed è quello che i progetti fst.snd
. Cioè, le variabili diventano il percorso verso la loro fonte.
const
ci consente di introdurre costanti. Interessante come il nome si allinea con il significato!
Ho poi generalizzato questa idea con applicativo in modo che si può scrivere qualsiasi funzione in uno stile inutile (finché si dispone di un'analisi caso disponibili come funzioni, come ad esempio maybe
, either
, bool
). Anche in questo caso, const
svolge il ruolo di introduzione di costanti. Puoi vedere questo lavoro nel pacchetto Data.Function.Tacit.
Quando si inizia in modo astratto, all'obiettivo, e quindi si lavora verso un'implementazione, si può essere sorpresi dalle risposte. Vale a dire, qualsiasi funzione può essere misteriosa come qualsiasi ingranaggio in una macchina. Se si tira indietro per vedere l'intera macchina in vista, tuttavia, è possibile comprendere il contesto in cui tale ingranaggio è necessario.
Un esempio: 'backgroundColor :: Text -> Color' è per me' backgroundColor = const White' – Zhen