Ich bin in meinem Musikprojekt auf ein kleines ästhetisches Problem gestoßen, das mich seit einiger Zeit nervt.
Ich habe einen Typ data Key = C | D | ...und kann einen Scaleaus a Keyund a konstruieren Mode. Das Modeunterscheidet zB eine Dur- und eine Moll-Tonleiter.
Ich kann den ModeTyp als Funktion von Keybis definieren Scale. In diesem Fall haben die Modi Kleinbuchstaben (was in Ordnung ist) und ich kann eine solche Skala erhalten
aScale = major C
Aber Musiker reden nicht so. Sie beziehen sich auf dieser Skala als die C - Dur - Tonleiter, nicht die C - Dur - Skala.
Was ich möchte
Idealerweise möchte ich schreiben
aScale = C major
Ist das überhaupt möglich?
Was ich versucht habe
Ich kann Keyeine Funktion erstellen, die a Scaleaus a konstruiert Mode, damit ich schreiben kann
aScale = c Major
Aber ich kann Keys nicht auf die Konstruktion von Skalen beschränken. Sie werden auch für andere Dinge benötigt (z . B. zum Erstellen von Akkorden ). Sollte Keyauch eine Instanz von sein Show.
Ich kann das Modenach dem setzen, Keywenn ich eine zusätzliche Funktion (oder einen Wertkonstruktor) verwende:
aScale = scale C major mit scale :: Key -> Mode -> Scale
Aber die zusätzliche Wortskala sieht laut aus und befasst sich entgegen ihrem Namen scalenicht wirklich mit Skalen. Der intelligente Teil ist in major, scaleist wirklich gerecht flip ($).
Die Verwendung von a newtype Mode = Major | Minor ...ändert sich nicht wirklich, außer scaledass es intelligenter sein muss:
aScale = scale C Major
major C.