मुझे अपने संगीत प्रोजेक्ट में एक छोटे से सौंदर्य मुद्दे का सामना करना पड़ा और यह मुझे कुछ समय के लिए परेशान कर रहा है।
मेरे पास एक प्रकार है data Key = C | D | ...और मैं Scaleए Keyऔर ए से निर्माण कर सकता हूं Mode। Modeएक प्रमुख और एक छोटे पैमाने पर जैसे के बीच का अंतर।
मैं परिभाषित कर सकते हैं Modeसे एक समारोह के रूप प्रकार Keyके लिए Scale। उस स्थिति में मोड में लोअरकेस नाम होंगे (जो ठीक है) और मुझे इस तरह स्केल मिल सकता है
aScale = major C
लेकिन संगीतकार इस तरह की बात नहीं करते। वे इस पैमाने को C प्रमुख पैमाने के रूप में संदर्भित करते हैं , प्रमुख C स्केल को नहीं।
मैं क्या चाहता हूँ
आदर्श रूप में मैं लिखना चाहूंगा
aScale = C major
क्या यह वास्तव में संभव है?
मैंने क्या कोशिश की
मैं Keyएक ऐसा फंक्शन बना सकता हूं, जो ए Scaleसे बनता है Mode, इसलिए मैं लिख सकता हूं
aScale = c Major
लेकिन मैं तराजू के निर्माण के लिए कुंजी को सीमित नहीं कर सकता। वे अन्य चीजों के लिए भी आवश्यक हैं (जैसे कि chords का निर्माण )। का Keyएक उदाहरण भी होना चाहिए Show।
जब मैं एक अतिरिक्त फ़ंक्शन (या मूल्य निर्माणकर्ता) का उपयोग करता हूं Mode, Keyतो मैं इसे डाल सकता हूं :
aScale = scale C major साथ में scale :: Key -> Mode -> Scale
लेकिन अतिरिक्त शब्द पैमाने शोर और इसके नाम के विपरीत दिखता है, scaleवास्तव में तराजू से चिंतित नहीं है। बुद्धिमान हिस्सा है major, scaleवास्तव में बस है flip ($)।
newtype Mode = Major | Minor ...वास्तव में बहुत अधिक परिवर्तन scaleकरने की आवश्यकता नहीं है, सिवाय इसके कि अधिक बुद्धिमान होने का उपयोग न करें :
aScale = scale C Major
major C।