सामान्य तौर पर, आप उच्च-श्रेणी के बहुरूपता का उपयोग करते हैं जब आप चाहते हैं कि कॉलली एक प्रकार के पैरामीटर के मूल्य का चयन करने में सक्षम हो, बजाय कॉलर के । उदाहरण के लिए:
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
लिए एक पैरामीटर जोड़कर पूरा करने के लिए उच्च-रैंक वाले प्रकारों का उपयोग कर सकते हैं , जो कि पूरी तरह से सार है- यह "गुंजाइश" का प्रतिनिधित्व करता है । अब हमारे हस्ताक्षर हैं:Resource
Action
Action
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) => {}