2015-01-21 5 views
11

जब एक प्रकार हस्ताक्षर पर संदर्भों लेखन, आमतौर पर मैं कुछ की तरह करना होगाहास्केल एकाधिक संदर्भ - करीना?

f :: (Enum a, Ord a) => a -> a 

लेकिन सरासर गूंगा भाग्य के माध्यम से मैंने पाया कि इस संकलित करता है तथा, हूबहू काम करने के लिए कम से कम GHC 7.8 पर लगता है:

f :: Enum a => Ord a => a -> a 

दोनों के बीच सैद्धांतिक या व्यावहारिक अंतर क्या हैं? दूसरा दूसरा रूढ़िवादी है? Haskell report दूसरे रूप का कोई उल्लेख नहीं करता है, और मैंने इसे कभी भी कहीं भी नहीं देखा है। Related question

+0

एसपीजे ने एक व्याख्यान प्रस्तुत किया जिसमें उन्होंने समझाया कि किस बाधाओं को संकलित किया गया है। https://www.youtube.com/watch?v=6COvD8oynmI - संक्षेप में, वे अपने आप में तर्क तर्क कर रहे हैं। – AJFarmar

उत्तर

6

दो संस्करण समान हैं। बाधाओं और forall-वे दायरे के शीर्ष पर बाहर निकलते हैं जब वे पहले से मौजूद नहीं होते हैं। उदाहरण के लिए, निम्नलिखित परिभाषा मान्य हैं:

foo :: a -> a -> Num a => a 
foo = (+) 

bar :: a -> forall b. b -> a 
bar = const 

लेकिन :t foo प्रिंट Num a => a -> a -> a और :t bar प्रिंट a -> b -> a (जो forall a b. a -> b -> a के बराबर है)।

जीएचसी पॉलिमॉर्फिक रिटर्न प्रकारों का समर्थन नहीं करता है, यही कारण है कि बाधाएं और क्वांटिफायर बाहर निकलते हैं। मुझे लगता है कि यह त्रुटियों को फेंकने के लिए जीएचसी के लिए वैध डिजाइन विकल्प भी हो सकता था।

+0

हालांकि पहली बार 2010 व्याकरण का पालन करने पर पहले पार्सर त्रुटि होनी चाहिए। फिर, दूसरी तरफ, [जीएचसी का पार्सर] (https://github.com/ghc/ghc/blob/master/compiler/parser/Parser.y) उन चीजों से भरा है जिन्हें मैं समझ नहीं पा रहा हूं। – Zeta

+0

एफटीआर, यहां पार्सर का प्रासंगिक हिस्सा है: https://github.com/ghc/ghc/blob/851ed7211fb18fea938be84c99b6389f6762b30d/compiler/parser/Parser.y#L1082 – kirelagin

संबंधित मुद्दे