J'ai rencontré un petit problème esthétique dans mon projet musical et cela me dérange depuis un certain temps.
J'ai un type data Key = C | D | ...et je peux construire un à Scalepartir d'un Keyet d'un Mode. Le fait la Modedistinction entre, par exemple, une échelle majeure et une échelle mineure.
Je peux définir le Modetype en fonction de Keyà Scale. Dans ce cas, les modes auront des noms en minuscules (ce qui est bien) et je peux obtenir une échelle comme celle-ci
aScale = major C
Mais les musiciens ne parlent pas comme ça. Ils se réfèrent à cette échelle comme l' échelle majeure en C , et non pas l' échelle majeure en C.
Ce que je veux
Idéalement, je voudrais écrire
aScale = C major
Est-ce possible?
Ce que j'ai essayé
Je peux faire Keyune fonction qui construit un à Scalepartir d'un Mode, donc je peux écrire
aScale = c Major
Mais je ne peux pas limiter les clés à la construction des échelles. Ils sont également nécessaires pour d'autres choses (par exemple la construction d' accords ). Devrait également Keyêtre une instance de Show.
Je peux mettre l' Modeafter Keyquand j'utilise une fonction supplémentaire (ou constructeur de valeur):
aScale = scale C major avec scale :: Key -> Mode -> Scale
Mais l' échelle de mot supplémentaire semble bruyante et contrairement à son nom, elle scalene s'intéresse pas vraiment aux échelles. La partie intelligente est dedans major, scalec'est vraiment juste flip ($).
Utiliser un newtype Mode = Major | Minor ...ne change pas vraiment grand chose, sauf qu'il scaledoit être plus intelligent:
aScale = scale C Major
major C.