Saya mengalami masalah estetika kecil dalam proyek musik saya dan itu telah mengganggu saya selama beberapa waktu.
Saya memiliki tipe data Key = C | D | ...
dan saya dapat membangun Scale
dari Key
dan Mode
. Yang Mode
membedakan antara skala mayor dan minor.
Saya dapat mendefinisikan Mode
tipe sebagai fungsi dari Key
hingga Scale
. Dalam hal ini mode akan memiliki nama huruf kecil (yang baik-baik saja) dan saya bisa mendapatkan Skala seperti ini
aScale = major C
Tetapi musisi tidak berbicara seperti ini. Mereka menyebut skala ini sebagai skala C mayor , bukan skala C mayor .
Apa yang saya inginkan
Idealnya saya ingin menulis
aScale = C major
Apakah ini mungkin?
Apa yang saya coba
Saya dapat membuat Key
fungsi yang membangun a Scale
dari Mode
, jadi saya bisa menulis
aScale = c Major
Tapi saya tidak bisa membatasi Kunci untuk membangun Timbangan. Mereka diperlukan untuk hal-hal lain juga (misalnya membangun akord ). Juga Key
harus menjadi contoh dari Show
.
Saya bisa meletakkan Mode
setelah Key
ketika saya menggunakan fungsi tambahan (atau konstruktor nilai):
aScale = scale C major
dengan scale :: Key -> Mode -> Scale
Tetapi skala kata tambahan terlihat berisik dan bertentangan dengan namanya, scale
tidak terlalu peduli dengan skala. Bagian yang cerdas adalah major
, scale
benar-benar adil flip ($)
.
Menggunakan a newtype Mode = Major | Minor ...
tidak terlalu banyak berubah, kecuali scale
harus lebih pintar:
aScale = scale C Major
major C
.