मोनैड परिभाषा में फोड़ा केवल सार्वभौमिक मात्रा को और स्पष्ट बनाने के लिए है। यदि आपके पास आगे प्रतिबंधों के बिना एक प्रकार परिवर्तनीय है तो यह डिफ़ॉल्ट रूप से सार्वभौमिक है, यानी कुछ भी हो सकता है।
तो देता है forall के दो का उपयोग करता है के बीच अंतर को देखो और कैसे Haskell उन्हें देख सकते हैं:
अंतर्निहित:
foo :: (x -> f x) -> a -> b -> (f a, f b)
-- same as
foo :: forall f x a b . (x -> f x) -> a -> b -> (f a, f b)
-- our function is applied to a, so x is equal to a
foo :: forall f x a b . (x ~ a) => (x -> f x) -> a -> b -> (f a, f b)
-- our function is also applied to b, so x is equal to b
foo :: forall f x a b . (x ~ a, x ~ b) => (x -> f x) -> a -> b -> (f a, f b)
उह ओह, (एक्स ~ एक, एक्स ~ ख) की आवश्यकता होगी (ए ~ बी)। इसे एनोटेशन के बिना अनुमानित किया जाएगा, लेकिन चूंकि हमने स्पष्ट रूप से विभिन्न प्रकार के चर का उपयोग किया है, सब कुछ उड़ाता है। इसे हल करने के लिए हमें हमारे कार्य के भीतर polymorphic रहने के लिए एफ की जरूरत है।
मानक हैकेल इसे व्यक्त नहीं कर सकता है इसलिए हमें रैंक 2 प्रकार या रैंकटाइप की आवश्यकता होगी। इसके साथ हम लिख सकते हैं:
foo :: (forall x . x -> f x) -> a -> b -> (f a, f b)
नोट करें कि फ़ॉल फ़ंक्शन प्रकार का हिस्सा है। इस तरह यह हमारे कार्य में polymorphic रहता है और हम इसे सब कुछ उड़ाने के बिना विभिन्न प्रकार के लिए लागू कर सकते हैं!
नोट हम भी करते हैं सकता है:
foo :: Monad m => a -> b -> (m a, m b)
foo a b = (return a, return b)
सुनिश्चित नहीं हैं कि क्यों सभी प्रश्नों के उत्तर तो अधिक शब्दों वाले हैं। एक वाक्य में: आप सही हैं; यह कुछ भी नहीं बदलता है और स्पष्ट होने के लिए बस वहां है। – Ryan
'के लिए एक बी। <..> '' = '* * के प्रकार में * एक विशिष्ट फ़ंक्शन के लिए बाध्य है - फ़ंक्शन 'एम ए -> (ए -> एम बी) -> एम बी'। आपके पास फ़ंक्शन के बिना 'forall' भी हो सकता है, उदा। '[] :: फोरल ए। [ए] ',' खाली :: फोरल एफ ए। वैकल्पिक एफ => एफ ए'। – user2407038
@Ryan जब मुझे जवाब मिलता है: "क्योंकि सबकुछ पूरी तरह योग्य है।" मेरा अनुवर्ती प्रश्न अक्सर "क्यों?" होता है। – ThreeFx