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 Scale
aus a Key
und a konstruieren Mode
. Das Mode
unterscheidet zB eine Dur- und eine Moll-Tonleiter.
Ich kann den Mode
Typ als Funktion von Key
bis 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 Key
eine Funktion erstellen, die a Scale
aus 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 Key
auch eine Instanz von sein Show
.
Ich kann das Mode
nach dem setzen, Key
wenn 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 scale
nicht wirklich mit Skalen. Der intelligente Teil ist in major
, scale
ist wirklich gerecht flip ($)
.
Die Verwendung von a newtype Mode = Major | Minor ...
ändert sich nicht wirklich, außer scale
dass es intelligenter sein muss:
aScale = scale C Major
major C
.