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 Scalea Keyve a ' dan a oluşturabilirim Mode. ModeBüyük ve küçük ölçekli örneğin arasındaki farklılaşacaktır.
I tanımlayabilir Modebir fonksiyonu olarak türü Keyiç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 Keybir oluşturur bir işlev Scale, bir gelen Modeyazabilirim 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 Keybir örneği olmalıdır Show.
Ben ekstra bir işlev (veya değer yapıcı) kullandığınızda Modesonra 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, scalegerçekten ölçeklerle ilgilenmiyor. Akıllı parçası olduğunu major, scalegerçekten sadece bir flip ($).
A'nın kullanılması newtype Mode = Major | Minor ...gerçekten daha fazla değişmez, ancak scaledaha akıllı olması gerekir:
aScale = scale C Major
major C.