को देखते हुए निम्नलिखित परिभाषा:हास्केल रैंक दो बहुरूपता संकलन त्रुटि
import Control.Monad.ST
import Data.STRef
fourty_two = do
x <- newSTRef (42::Int)
readSTRef x
GHC के अंतर्गत निम्नलिखित compiles:
main = (print . runST) fourty_two -- (1)
लेकिन यह नहीं करता है:
main = (print . runST) $ fourty_two -- (2)
लेकिन तब के रूप में bdonlan एक टिप्पणी में बताते हैं, यह संकलित करता है:
main = ((print . runST) $) fourty_two -- (3)
लेकिन, इस
main = (($) (print . runST)) fourty_two -- (4)
कौन सा संकेत मिलता है कि (3) केवल इन्फ़िक्स $
की विशेष उपचार की वजह से संकलित लगता है संकलन नहीं करता है, लेकिन यह अभी भी स्पष्ट नहीं होता क्यों (1) संकलन करता है
सवाल:
1) मैं निम्नलिखित दो सवाल (first, second) पढ़ा है, और मुझे विश्वास है $
केवल monomorphic प्रकार के साथ instantiated किया जा सकता है का नेतृत्व कर रहे थे। लेकिन मैं इसी तरह मानता हूं कि .
केवल मोनोमोर्फिक प्रकारों के साथ तत्काल हो सकता है, और परिणामस्वरूप भी असफल हो जाएगा। पहला कोड सफल क्यों होता है लेकिन दूसरा कोड नहीं होता है? (उदाहरण के लिए क्या एक विशेष नियम जीएचसी के पहले मामले में है कि यह दूसरे में लागू नहीं हो सकता है?)
2) क्या कोई मौजूदा जीएचसी एक्सटेंशन है जो दूसरे कोड को संकलित करता है? (शायद ImpredicativePolymorphism कुछ बिंदु पर यह काम किया है, लेकिन यह पदावनत लगता है, कुछ भी बदल दिया गया है?)
3) वहाँ क्या $
करता है वह करने GHC एक्सटेंशन का उपयोग `my_dollar`
कहना निर्धारित करने का कोई रास्ता नहीं है, लेकिन यह भी बहुरूपी संभाल करने में सक्षम है प्रकार, तो (print . runST) `my_dollar` fourty_two
संकलन?
संपादित करें: प्रस्तावित उत्तर:
main = ((.) print runST) fourty_two -- (5)
इस रूप में (1), .
की इन्फ़िक्स संस्करण का उपयोग नहीं सिवाय एक ही है:
इसके अलावा, निम्नलिखित संकलित करने के लिए विफल रहता है।
परिणामस्वरूप, ऐसा लगता है कि जीएचसी के पास $
और .
दोनों के लिए विशेष नियम हैं, लेकिन केवल उनके इन्फिक्स संस्करण हैं।
यह और भी दिलचस्प, '((प्रिंट runST) $।) बनाने के fourty_two' _does_ काम – bdonlan
यह दिलचस्प है और आगे चीजें confuses! – Clinton
मैं काफी हद तक निश्चित हूं कि जीएचसी में 'रनस्ट $ डू' मामले का समर्थन करने के लिए एक विशेष नियम है, लेकिन अब मुझे कोई उद्धरण नहीं मिला है। –