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