ฉันพบปัญหาเกี่ยวกับสุนทรียศาสตร์เล็กน้อยในโครงการดนตรีของฉันและมันก็บั่นทอนฉันมาระยะหนึ่งแล้ว
ฉันมีชนิดdata Key = C | D | ...และฉันสามารถสร้างScaleจากและKey ModeความModeแตกต่างระหว่างเช่นขนาดใหญ่และขนาดเล็ก
ฉันสามารถกำหนดModeประเภทเป็นฟังก์ชั่นจากไปKey Scaleในกรณีนั้นโหมดจะมีชื่อตัวพิมพ์เล็ก (ซึ่งใช้ได้) และฉันสามารถรับสเกลได้เช่นนี้
aScale = major C
แต่นักดนตรีจะไม่พูดเช่นนี้ พวกเขาอ้างถึงขนาดนี้เป็นC ที่สำคัญขนาดไม่c เมเจอร์สเกล
สิ่งที่ฉันต้องการ
เป็นการดีที่ฉันต้องการเขียน
aScale = C major
เป็นไปได้ทั้งหมดหรือไม่
สิ่งที่ฉันพยายาม
ฉันสามารถสร้างKeyฟังก์ชั่นที่สร้างScaleจาก a Modeดังนั้นฉันจึงเขียนได้
aScale = c Major
แต่ฉันไม่สามารถ จำกัด กุญแจในการสร้างเครื่องชั่งได้ พวกเขามีความจำเป็นสำหรับสิ่งอื่น ๆ เช่นกัน (เช่นการสร้างคอร์ด ) นอกจากนี้ควรจะเป็นตัวอย่างของKeyShow
ฉันสามารถใส่ModeหลังKeyเมื่อฉันใช้ฟังก์ชั่นพิเศษ (หรือตัวสร้างมูลค่า):
aScale = scale C major กับ scale :: Key -> Mode -> Scale
แต่ขนาดของคำที่เพิ่มขึ้นนั้นดูเหมือนจะมีเสียงรบกวนและตรงกันข้ามกับชื่อของมันscaleไม่เกี่ยวกับเกล็ด ส่วนที่มีความคิดสร้างสรรค์อยู่ในmajor, เป็นจริงเพียงscaleflip ($)
การใช้ a newtype Mode = Major | Minor ...ไม่ได้เปลี่ยนไปมากนักยกเว้นscaleต้องมีความฉลาดมากขึ้น:
aScale = scale C Major
major Cเพียงแค่ไปด้วย