Müzik projemde küçük bir estetik sorunla karşılaştım ve bir süredir beni rahatsız ediyor.
Bir tipim var data Key = C | D | ...
ve Scale
a Key
ve a ' dan a oluşturabilirim Mode
. Mode
Büyük ve küçük ölçekli örneğin arasındaki farklılaşacaktır.
I tanımlayabilir Mode
bir fonksiyonu olarak türü Key
için Scale
. Bu durumda, modların küçük harfli adları vardır (ki bu iyidir) ve böyle bir Ölçek alabilirim
aScale = major C
Ama müzisyenler böyle konuşmuyor. Bu ölçeğe büyük C ölçeği değil, C büyük ölçeği denir.
İstediğim
İdeal olarak yazmak istiyorum
aScale = C major
Bu hiç mümkün mü?
Ne denedim
Ben yapabilir Key
bir oluşturur bir işlev Scale
, bir gelen Mode
yazabilirim böylece,
aScale = c Major
Ama Keys'i Ölçekler oluşturmakla sınırlayamıyorum. Başka şeyler için de gereklidirler (örneğin, akorlar inşa etmek ). Ayrıca Key
bir örneği olmalıdır Show
.
Ben ekstra bir işlev (veya değer yapıcı) kullandığınızda Mode
sonra koyabilirsiniz Key
:
aScale = scale C major
ile scale :: Key -> Mode -> Scale
Ancak ekstra kelime ölçeği gürültülü görünüyor ve isminin aksine, scale
gerçekten ölçeklerle ilgilenmiyor. Akıllı parçası olduğunu major
, scale
gerçekten sadece bir flip ($)
.
A'nın kullanılması newtype Mode = Major | Minor ...
gerçekten daha fazla değişmez, ancak scale
daha akıllı olması gerekir:
aScale = scale C Major
major C
.