Ho riscontrato un piccolo problema estetico nel mio progetto musicale e mi ha infastidito da tempo.
Ho un tipo data Key = C | D | ...
e posso costruire a Scale
da a Key
e a Mode
. La Mode
distinzione tra ad esempio una scala maggiore e una minore.
Posso definire il Mode
tipo come funzione da Key
a Scale
. In tal caso le modalità avranno nomi in minuscolo (il che va bene) e posso ottenere una scala come questa
aScale = major C
Ma i musicisti non parlano così. Si riferiscono a questa scala come alla scala C maggiore , non alla scala C maggiore .
Quello che voglio
Idealmente vorrei scrivere
aScale = C major
Ciò è effettivamente possibile?
Quello che ho provato
Posso creare Key
una funzione che costruisce a Scale
da a Mode
, così posso scrivere
aScale = c Major
Ma non posso limitare le chiavi alla costruzione di scale. Sono necessari anche per altre cose (ad esempio la costruzione di accordi ). Inoltre Key
dovrebbe essere un'istanza di Show
.
Posso mettere il Mode
dopo il Key
quando uso una funzione extra (o costruttore di valore):
aScale = scale C major
con scale :: Key -> Mode -> Scale
Ma la scala di parole extra sembra rumorosa e contrariamente al suo nome, scale
non è realmente interessata alle scale. La parte intelligente è dentro major
, scale
è davvero giusta flip ($)
.
L'uso di a newtype Mode = Major | Minor ...
non cambia molto, tranne scale
per essere più intelligente:
aScale = scale C Major
major C
.