Я зіткнувся з невеликим естетичним питанням у своєму музичному проекті, і це мене клопоче вже певний час.
У мене є тип, 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
.