2010-05-21 20 views
16

यह मूर्खतापूर्ण लगता है, लेकिन मुझे यह नहीं मिल रहा है। अभिव्यक्ति [] == [] क्यों टाइप की जा सकती है? अधिक विशेष रूप से, किस प्रकार (कक्षा ईक में) सूची तत्वों के प्रकार से अनुमानित है?`([] ==) []` अनुमानित हैकेल का प्रकार कैसा है?

Prelude> :t (==[]) 
(==[]) :: (Eq [a]) => [a] -> Bool 

लेकिन बाधा Eq [a] भी Eq a का तात्पर्य, के रूप में यहाँ दिखाया गया है:

Prelude> (==[]) ([]::[IO()]) 

<interactive>:1:1: 
No instance for (Eq (IO())) 
    arising from use of `==' at <interactive>:1:1-2 
Probable fix: add an instance declaration for (Eq (IO())) 
In the definition of `it': it = (== []) ([] :: [IO()]) 

इस प्रकार [] == [] में,

एक GHCi सत्र में, मैं निम्न देखें , टाइप चेकर को यह मानना ​​चाहिए कि सूची तत्व कुछ प्रकार है जो क्लास ईक में है। पर कौनसा? [] का प्रकार सिर्फ [ए] है, और यह निश्चित रूप से ईक ए => [ए] से अधिक सामान्य है।

IMHO इस करना चाहिए अस्पष्ट, कम से कम हास्केल 98 (जो कि हम क्या बात कर रहे हैं)

+3

मैं बाधा में 'अस्पष्ट प्रकार चर \' एक 'मिल गया है \ '== '' – kennytm

+0

@ केनी के उपयोग से उत्पन्न होने वाला एक' एक '- हां, जो मैंने ghci में कोशिश करने से पहले अपेक्षित था - मेरा आश्चर्य जितना बड़ा होगा। धन्यवाद संकेत के लिए, अब मेरी विश्व व्यवस्था बहाल है :) – Ingo

+0

यह दिलचस्प हग्स अभिव्यक्ति '[] == []' 'प्रकार Eq एक => Bool' देता है। – sdcvvc

उत्तर

19

GHCi है जो आप ऊपर फिसल गया extended rules for type defaulting, है। इस मामले में, मेरा मानना ​​है कि यह संदिग्ध प्रकार को () पर डिफ़ॉल्ट करेगा। सूक्ष्म तरीके कि GHCi बर्ताव करता है अलग ढंग से बेहतर अन्तरक्रियाशीलता के लिए अच्छा है, लेकिन वे कभी-कभी भ्रम की स्थिति में परिणाम है ...

GHC (नहीं GHCi) के साथ
+8

@camccann: 'ghci -Wall' चलाएं। फिर '[] == []' हो जाता है 'चेतावनी:'() '' – yairchu

+1

टाइप करने के लिए निम्न बाधाओं को डिफॉल्ट करना विस्तारित डिफ़ॉल्ट केवल तभी महत्वपूर्ण होता है जब आप कोड दिखाना या चलाने के लिए चाहते हैं। :: (ईक ए) => [ए] -> बूल प्रकार पूरी तरह से सही है। –

+1

@ डॉन स्टीवर्ट: वह प्रकार निश्चित रूप से ठीक है - मुझे लगता है कि उलझन में क्या उलझन है '([] == []) :: बूल', जहां संदिग्ध 'ईक ए' बाधा डिफ़ॉल्ट रूप से '() से संतुष्ट होती है ', जैसा कि यैचु ने दिखाया। –

1

GHC सबसे सामान्य प्रकार infers में से:

(== []) :: (- Eq क) => [एक]> बूल

यह रूप में पढ़ा जाना चाहिए:

  • अगर आप Eq एक का एक उदाहरण है,
  • तो हास्केल आप उन लोगों की सूची से एक समारोह दे सकते हैं 'एक तो हाँ, निहितार्थ यहाँ आप सूची के तत्वों के लिए समीकरण का एक उदाहरण है, और GHC पहले से ही एक उदाहरण है कि bool करने के लिए

है सामान्य रूप से सूचियों के लिए (तत्वों के लिए ईक पर निर्भर), इसलिए हमें एक अच्छा सामान्य प्रकार मिलता है।

प्रकार चेकर "मान लिया गया है" आप एक समीकरण एक उदाहरण है जब एक विशेष प्रकार पर कहा जाता है की आपूर्ति कर सकते हैं।

मैं एक Eq [a] बाधा होने के अपने परिणामों को पुन: पेश नहीं कर सकते।

+0

हालांकि केनी के ऊपर जीएचसी के साथ अलग-अलग परिणाम मिले। नोट: हम हैकेल 98 से बात कर रहे हैं, मुझे यकीन है कि कुछ फैंसी जीएचसी एक्सटेंशन इसे सही टाइप करने के लिए पर्याप्त चालाक हैं, फिर भी मुझे अभी भी समझ में नहीं आता है कि वास्तव में कैसे। आईएमएचओ, यह वास्तव में एक संदिग्ध मामला है। – Ingo

+1

@Ingo: '(== []) 'संदिग्ध नहीं है, केवल सामान्य रूप से बहुलक है; यह जीएचसीआई या अन्यथा वही (और सही ढंग से) काम करेगा। GHC एक्सटेंशन के लिए के रूप में, आप एक ही दोषी है कि GHCi का उपयोग करता बढ़ाया सक्षम कर सकते हैं, लेकिन मैं नहीं जानता कि आप क्यों चाहते हैं के लिए ... –

+0

@Don: शायद आप अलग संस्करण/झंडे है?मेरे लिए: एक्स: \ fc3> ghci ___ ___ _ /_ \/\/\/__ (_) // _ \ ///_///| | एचएससीएल 98 के लिए जीएचसी इंटरएक्टिव, संस्करण 6.4.2, // _ \\/__// ___ | | http://www.haskell.org/ghc/ \ ____/\// _/\ ____/| _ | प्रकार :? मदद के लिए। पैकेज बेस-1.0 लोड हो रहा है ... लिंकिंग ... किया गया। प्रस्तावना>: टी (== []) (== []) :: (ईक [ए]) => [ए] -> बूल प्रस्तावना> – Ingo

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