मुझे अपने संगीत प्रोजेक्ट में एक छोटे से सौंदर्य मुद्दे का सामना करना पड़ा और यह मुझे कुछ समय के लिए परेशान कर रहा है।
मेरे पास एक प्रकार है 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
।