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 Scaledari Keydan Mode. Yang Modemembedakan antara skala mayor dan minor.
Saya dapat mendefinisikan Modetipe sebagai fungsi dari Keyhingga 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 Keyfungsi yang membangun a Scaledari 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 Keyharus menjadi contoh dari Show.
Saya bisa meletakkan Modesetelah Keyketika 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, scaletidak terlalu peduli dengan skala. Bagian yang cerdas adalah major, scalebenar-benar adil flip ($).
Menggunakan a newtype Mode = Major | Minor ...tidak terlalu banyak berubah, kecuali scaleharus lebih pintar:
aScale = scale C Major
major C.