Я столкнулся с небольшой эстетической проблемой в моем музыкальном проекте, и это беспокоило меня в течение некоторого времени.
У меня есть тип, data Key = C | D | ...
и я могу построить Scale
из а Key
и а Mode
. В Mode
различает , например , крупный и незначительный масштаб.
Я могу определить Mode
тип как функцию от Key
до Scale
. В этом случае режимы будут иметь имена в нижнем регистре (это нормально), и я могу получить такой масштаб
aScale = major C
Но музыканты так не разговаривают. Они называют эту шкалу C-мажорной шкалой, а не мажорной 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
.