सामान्य तौर पर, आप उच्च-श्रेणी के बहुरूपता का उपयोग करते हैं जब आप चाहते हैं कि कॉलली एक प्रकार के पैरामीटर के मूल्य का चयन करने में सक्षम हो, बजाय कॉलर के । उदाहरण के लिए:
f :: (forall a. Show a => a -> Int) -> (Int, Int)
f g = (g "one", g 2)
कोई भी फ़ंक्शन gजो मैं इसे पास करता हूं, fमुझे Intकिसी प्रकार के मूल्य से मुझे देने में सक्षम होना चाहिए , जहां केवल एक चीज gउस प्रकार के बारे में जानती है कि इसका एक उदाहरण है Show। तो ये कोषेर हैं:
f (length . show)
f (const 42)
लेकिन ये नहीं हैं:
f length
f succ
एक विशेष रूप से उपयोगी अनुप्रयोग मानों की स्कूपिंग को लागू करने के लिए प्रकारों के स्कोपिंग का उपयोग करने में है । मान लीजिए कि हमारे पास एक प्रकार की वस्तु है Action<T>, एक कार्रवाई का प्रतिनिधित्व करते हुए हम Tभविष्य या कॉलबैक जैसे प्रकार के परिणाम का उत्पादन कर सकते हैं ।
T runAction<T>(Action<T>)
runAction :: forall a. Action a -> a
अब, मान लीजिए कि हमारे पास एक Actionऐसा भी है जो Resource<T>वस्तुओं को आवंटित कर सकता है:
Action<Resource<T>> newResource<T>(T)
newResource :: forall a. a -> Action (Resource a)
हम यह लागू करना चाहते हैं कि उन संसाधनों का उपयोग केवल उसी Actionजगह के अंदर किया जाता है जहां वे बनाए गए थे, और विभिन्न कार्यों या एक ही कार्रवाई के अलग-अलग रन के बीच साझा नहीं किए गए थे, ताकि क्रियाएं नियतात्मक और दोहराव योग्य हों।
हम इसे और प्रकारों के Sलिए एक पैरामीटर जोड़कर पूरा करने के लिए उच्च-रैंक वाले प्रकारों का उपयोग कर सकते हैं , जो कि पूरी तरह से सार है- यह "गुंजाइश" का प्रतिनिधित्व करता है । अब हमारे हस्ताक्षर हैं:ResourceActionAction
T run<T>(<S> Action<S, T>)
Action<S, Resource<S, T>> newResource<T>(T)
runAction :: forall a. (forall s. Action s a) -> a
newResource :: forall s a. a -> Action s (Resource s a)
अब जब हम runActionएक Action<S, T>देते हैं, तो हमें विश्वास दिलाया जाता है कि क्योंकि "स्कोप" पैरामीटर Sपूरी तरह से बहुरूपी है, यह runActionकिसी भी प्रकार के किसी भी मूल्य के शरीर से बच नहीं सकता है, Sजैसे कि उपयोग करता है जैसे कि Resource<S, int>बच नहीं सकता है!
(हास्केल में, यह STमठ के रूप में जाना जाता है , जहां runActionकहा जाता है runST, Resourceकहा जाता है STRef, और newResourceकहा जाता है newSTRef।)
let sdff = (g : (f : <T> (e : T) => void) => void) => {}