Eu encontrei um pequeno problema estético no meu projeto musical e ele está me incomodando há algum tempo.
Eu tenho um tipo data Key = C | D | ...
e posso construir a Scale
partir de a Key
e a Mode
. Os Mode
distingue entre, por exemplo, um grande e um menor escala.
Eu posso definir o Mode
tipo como uma função de Key
para Scale
. Nesse caso, os modos terão nomes em minúsculas (o que é bom) e posso obter uma escala como esta
aScale = major C
Mas músicos não falam assim. Eles se referem a essa escala como a escala C maior , não a escala C maior.
O que eu quero
Idealmente, eu gostaria de escrever
aScale = C major
Isso é possível em tudo?
O que eu tentei
Eu posso criar Key
uma função que construa a Scale
de a Mode
, para que eu possa escrever
aScale = c Major
Mas não posso limitar as chaves à construção de escalas. Eles são necessários para outras coisas também (por exemplo, construção de acordes ). Também Key
deve ser uma instância de Show
.
Eu posso colocar o Mode
depois do Key
quando eu uso uma função extra (ou construtor de valor):
aScale = scale C major
com scale :: Key -> Mode -> Scale
Mas a escala extra de palavras parece barulhenta e, ao contrário do nome, scale
não está realmente preocupada com escalas. A parte inteligente está dentro major
, scale
é realmente justa flip ($)
.
Usar um newtype Mode = Major | Minor ...
realmente não muda muito, exceto que scale
precisa ser mais inteligente:
aScale = scale C Major
major C
.