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 à Scale
partir d'un Key
et d'un Mode
. Le fait la Mode
distinction entre, par exemple, une échelle majeure et une échelle mineure.
Je peux définir le Mode
type 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 Key
une fonction qui construit un à Scale
partir 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' Mode
after Key
quand 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 scale
ne s'intéresse pas vraiment aux échelles. La partie intelligente est dedans major
, scale
c'est vraiment juste flip ($)
.
Utiliser un newtype Mode = Major | Minor ...
ne change pas vraiment grand chose, sauf qu'il scale
doit être plus intelligent:
aScale = scale C Major
major C
.