Tôi đã gặp một vấn đề thẩm mỹ nhỏ trong dự án âm nhạc của mình và nó đã làm tôi khó chịu một thời gian.
Tôi có một loại data Key = C | D | ...và tôi có thể xây dựng Scaletừ a Keyvà a Mode. Sự Modekhác biệt giữa ví dụ quy mô lớn và quy mô nhỏ.
Tôi có thể định nghĩa Modekiểu là một hàm từ Keyđến Scale. Trong trường hợp đó, các chế độ sẽ có tên chữ thường (không sao) và tôi có thể lấy Tỷ lệ như thế này
aScale = major C
Nhưng các nhạc sĩ không nói như thế này. Họ gọi thang đo này là thang đo C , không phải thang đo C chính .
Những gì tôi muốn
Lý tưởng nhất là tôi muốn viết
aScale = C major
cái này nó có hoàn toàn có thể xảy ra được không?
Những gì tôi đã cố gắng
Tôi có thể tạo Keymột hàm xây dựng Scaletừ a Mode, vì vậy tôi có thể viết
aScale = c Major
Nhưng tôi không thể giới hạn các phím để xây dựng Cân. Chúng cũng cần cho những thứ khác (ví dụ: xây dựng hợp âm ). Cũng Keynên là một ví dụ của Show.
Tôi có thể đặt Modesau Keykhi tôi sử dụng một hàm bổ sung (hoặc hàm tạo giá trị):
aScale = scale C major với scale :: Key -> Mode -> Scale
Nhưng thang đo từ thêm có vẻ ồn ào và trái với tên của nó, scalekhông thực sự quan tâm đến thang đo. Phần thông minh là trong major, scalethực sự chỉ là flip ($).
Sử dụng newtype Mode = Major | Minor ...không thực sự thay đổi nhiều, ngoại trừ scalecần phải thông minh hơn:
aScale = scale C Major
major C.