Я зіткнувся з невеликим естетичним питанням у своєму музичному проекті, і це мене клопоче вже певний час.
У мене є тип, data Key = C | D | ...і я можу побудувати букву Scaleвід a Keyі a Mode. У Modeрозрізняє , наприклад , великий і незначний масштаб.
Я можу визначити Modeтип як функцію від Keyдо Scale. У такому випадку режими матимуть малі імена (що нормально), і я можу отримати такий масштаб
aScale = major C
Але музиканти не говорять так. Вони називають цю шкалу як основну шкалу С , а не основну шкалу С.
Що я хочу
В ідеалі я хотів би написати
aScale = C major
Чи можливо це взагалі?
Що я спробував
Я можу зробити Keyфункцію, яка будує Scaleз а Mode, тож можу писати
aScale = c Major
Але я не можу обмежитися Ключами для побудови Терезів. Вони потрібні і для інших речей (наприклад, для створення акордів ). Також Keyмає бути екземпляр Show.
Я можу поставити Modeпісля, Keyколи використовую додаткову функцію (або конструктор значень):
aScale = scale C major з scale :: Key -> Mode -> Scale
Але додаткова шкала слова виглядає галасливою і всупереч її назви, scaleнасправді не стосується масштабів. Розумна частина є major, scaleнасправді справедлива flip ($).
Використання функції newtype Mode = Major | Minor ...насправді не сильно змінюється, за винятком scaleпотреби бути більш розумним:
aScale = scale C Major
major C.