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 Scaleda a Keye a Mode. La Modedistinzione tra ad esempio una scala maggiore e una minore.
Posso definire il Modetipo come funzione da Keya 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 Keyuna funzione che costruisce a Scaleda 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 Keydovrebbe essere un'istanza di Show.
Posso mettere il Modedopo il Keyquando 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, scalenon è 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 scaleper essere più intelligente:
aScale = scale C Major
major C.