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 Scale
từ a Key
và a Mode
. Sự Mode
khác biệt giữa ví dụ quy mô lớn và quy mô nhỏ.
Tôi có thể định nghĩa Mode
kiể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 Key
một hàm xây dựng Scale
từ 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 Key
nên là một ví dụ của Show
.
Tôi có thể đặt Mode
sau Key
khi 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ó, scale
không thực sự quan tâm đến thang đo. Phần thông minh là trong major
, scale
thực sự chỉ là flip ($)
.
Sử dụng newtype Mode = Major | Minor ...
không thực sự thay đổi nhiều, ngoại trừ scale
cần phải thông minh hơn:
aScale = scale C Major
major C
.