2015-07-25 8 views
5

जब मैं रैंकेंटाइप का उपयोग करता हूं, ऐसा लगता है कि (।) ऑपरेटर अच्छी तरह से काम नहीं करता है। इस सीमा को कहां दस्तावेज किया गया है?रैंकेंटाइप और डॉट ऑपरेटर

{-# LANGUAGE RankNTypes, ImpredicativeTypes #-} 

f :: Int -> (forall r. r -> r) 
f = undefined 

g :: (forall r. r -> r) -> Int 
g = undefined 

h :: Int -> Int 
-- h v = g (f v) -- It works well 
h = g . f -- I can't write it in this way 

मुझे निम्न त्रुटियां मिलती हैं।

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:11:9: 
    Couldn't match type ‘r0 -> r0’ with ‘forall r. r -> r’ 
    Expected type: Int -> forall r. r -> r 
     Actual type: Int -> r0 -> r0 
    In the second argument of ‘(.)’, namely ‘f’ 
    In the expression: g . f 
Failed, modules loaded: none. 
+2

यह विशेष रूप से '.' के साथ बहुत कम नहीं है, यह सामान्य है कि सामान्य उच्च-रैंक प्रकार_ के साथ स्वचालित रूप से स्वचालित प्रकार का अनुमान संभव नहीं है। – leftaroundabout

+1

@ बाएंअराउंडबाउट, अनुमान कैसे संबंधित है? बिडरेक्शनल टाइप चेकिंग + एकीकरण को इस मामले को कवर करना चाहिए। Agda कम से कम [खुश] (http://lpaste.net/137326) है। – user3237465

उत्तर

11

वास्तव में, f क्योंकि GHC floats out हर forall और वर्ग प्रतिबंध का दायरा के शीर्ष करने के प्रकार Int -> (forall r. r -> r) नहीं है,। तो f का प्रकार वास्तव में forall r. Int -> r -> r है।

उदाहरण के लिए, निम्नलिखित typechecks:

f :: Int -> (forall r. r -> r) 
f = undefined 

f' :: forall r. Int -> r -> r 
f' = f 

यह बनाता है g . f रचना बीमार लिखा जाता है (हम उस त्रुटि संदेश r -> r और forall r. r -> r के बीच विसंगति पर स्पष्ट रूप से बताते हैं देख सकते हैं)।

जीएचसी के लिए चुपचाप उन्हें बाहर निकालने के बजाय forall-गलत जगहों पर खोजने पर त्रुटियों को फेंकने के लिए शायद बेहतर व्यवहार होगा।

जीएचसी में पॉलिमॉर्फिक रिटर्न प्रकार (जिन्हें फ्लोटिंग आउट forall -s द्वारा अवैध रूप से प्रतिबंधित किया गया है) के कई कारण हैं। विवरण के लिए आप this paper (विशेष रूप से अनुभाग 4.6) का संदर्भ ले सकते हैं। संक्षेप में, अगर वे अपरिवर्तनीय तत्कालता के लिए ठोस समर्थन रखते हैं तो वे केवल समझ में आते हैं, जिसमें जीएचसी की कमी है। अपमानजनक प्रकारों की अनुपस्थिति में, फ़्लोटिंग-आउट टाइपकेक के लिए अधिक शर्तों की अनुमति देता है और वास्तविक दुनिया कोड में शायद ही कभी असुविधा का कारण बनता है।

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