2010-02-16 10 views
18

मुझे मज़दूरों को समझने में समस्याएं आ रही हैं, विशेष रूप से कंक्रीट प्रकार LYAH में है। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि मुझे समझ में नहीं आता कि [] वास्तव में क्या है।हास्केल में [] (सूची निर्माता) क्या है?

fmap :: (a -> b) -> f a -> f b 
  1. [], एक प्रकार-निर्माता है? या, यह एक मूल्य निर्माता है?
  2. इसका प्रकार क्या है: [] :: [a]?
  3. क्या यह Maybe टाइप-कन्स्ट्रक्टर, या Just वैल्यू कन्स्ट्रक्टर की तरह है?
    1. यदि यह Just की तरह है तो कैसे आ Just क्यों [] :: a -> [a] नहीं [] टाइप किया
  4. LYAH इस का कहना है के रूप में यह functors के लिए लागू होता है Just :: a -> Maybe a बजाय Just :: Maybe a की तरह एक हस्ताक्षर, दूसरे शब्दों में दिया गया है: सूचना उदाहरण के लिए हमने फ़ंक्शन [ए] क्यों नहीं लिखा, क्योंकि fmap :: (a -> b) -> fa -> fb से, हम देखते हैं कि f को एक प्रकार का कन्स्ट्रक्टर होना चाहिए जो एक प्रकार लेता है। [ए] पहले से ही एक ठोस प्रकार है (इसमें किसी भी प्रकार के साथ एक सूची है), जबकि [] एक प्रकार का कन्स्ट्रक्टर है जो एक प्रकार का होता है और [int], [स्ट्रिंग] या यहां तक ​​कि [[स्ट्रिंग]] जैसे प्रकार का उत्पादन कर सकता है। मैं उलझन में हूं हालांकि [] का प्रकार यह दर्शाता है कि यह [a] के लिए एक शाब्दिक जैसा है LYAH क्या प्राप्त करने का प्रयास कर रहा है?
+1

और यदि आप कुछ प्रकार चाहते हैं -> [ए], मजाकिया लग रहा है (: []) फ़ंक्शन। –

+0

^या आप 'रिटर्न' (या' शुद्ध' या अन्य) का उपयोग कर सकते हैं: डी –

+1

@ डैनियलवेलकोव: ': []' '' ''' धाराबद्ध वाक्यविन्यास का उपयोग करके आंशिक रूप से '[]' पर लागू किया गया है, बस स्पष्ट होना चाहिए। – mk12

उत्तर

15
  1. यह (भी संदेहास्पद मैं तुम्हें प्रदान कर देंगे) वाक्य रचना दोनों एक प्रकार निर्माता और एक मूल्य के निर्माता होने के लिए अतिभारित।

  2. इसका मतलब है कि (मूल्य निर्माता) [] प्रकार है कि, सभी प्रकार a के लिए, यह a की एक सूची (जो [a] लिखा है) है। ऐसा इसलिए है क्योंकि हर प्रकार एक खाली सूची है।

  3. मूल्य निर्माता [] लिखा गया नहीं a -> [a] क्योंकि खाली सूची कोई तत्व है, और इसलिए यह a की की एक खाली सूची बनाने के लिए एक a जरूरत नहीं है। इसके बजाए Nothing :: Maybe a की तुलना करें।

  4. LYAH के रूप में प्रकार [a] साथ मूल्य निर्माता [] करने का विरोध किया, तरह * -> * साथ प्रकार निर्माता [] बारे में बात कर रहा है।

+5

यह जानना उपयोगी हो सकता है कि एक प्रकार के रूप में, '[ए] '' [] ए' के लिए सिंटेक्टिक चीनी है, जो कि अधिक प्रकार के प्रकारों के लिए सामान्य रूप से चीजों को कैसे किया जाता है। –

8
  1. यह एक प्रकार निर्माता (जैसे [इंट] एक प्रकार है), और एक डेटा निर्माता ([2] एक सूची संरचना है)।
  2. खाली सूची किसी भी प्रकार के आयोजन एक सूची है
  3. [एक] है की तरह हो सकता है कि एक, [2] की तरह है बस 2.
  4. [] एक शून्य-ary समारोह (एक निरंतर) है, इसलिए यह 'नहीं करता है टी कार्य प्रकार है।
+1

मैं * वास्तव में * 4 में शब्द की तरह। मुझे लगता है कि यह आपके जवाब का संयोजन 4 और डॉग के जवाब को 3 में लाने के लिए मेरे सिर में ले गया! तो 'कुछ भी नहीं :: शायद एक', और '[] :: [ए] 'खाली कन्स्ट्रक्टर हैं। '[ए] '' शायद ए' के ​​अनुरूप भी है क्योंकि दोनों मूल्यों के लिए मूल्य रचनाकार हैं (कुछ भी से अलग नहीं)। निष्कर्ष, मैं '[]' से उलझन में था, क्योंकि '[]' अनिवार्य रूप से एक ऐरे के कुछ भी डेटा-कन्स्ट्रक्टर के साथ डेटा के कन्स्ट्रक्टर को ओवरलैप करता है, जहां 'शायद ए' के ​​दो अलग-अलग निर्माता होते हैं। क्या मैं सही हूँ? –

5

बस बातें अधिक स्पष्ट बनाने के लिए, इस डेटा प्रकार:

data List a = Cons a (List a) 
      | Nil 

... निर्मित सूची प्रकार के रूप में एक ही संरचना है, लेकिन (अच्छे है, लेकिन संभावित रूप से भ्रामक) के बिना विशेष वाक्य - विन्यास। तरह *

  • Nil = [] साथ तरह * -> *
  • List a = [a], प्रकार के साथ

    • List = [], प्रकार कंस्ट्रक्टर्स, और [a] क्रमशः
    • बहुरूपी प्रकार List a साथ महत्व देता है: यहाँ क्या कुछ पत्राचार की तरह लग रही है
    • Cons = :, प्रकार a -> List a -> List a औरके साथ डेटा कंस्ट्रक्टरक्रमशः
    • Cons 5 Nil = [5] या 5:[], एक तत्व को सूचीबद्ध
    • f Nil = ... = f [] = ..., पैटर्न से मेल खाते खाली सूचियों
    • f (Cons x Nil) = ... = च [x] = ... `, पैटर्न मिलान एकल तत्व सूचियों
    • f (Cons x xs) = ... = f (x:xs) = ..., पैटर्न मिलान गैर खाली सूचियों

    वास्तव में, यदि आप के बारे में [] GHCi से पूछते हैं, तो यह आपको बहुत मीटर बताता है एक ही परिभाषा uch:

    > :i [] 
    data [] a = [] | a : [a]   -- Defined in GHC.Types 
    

    लेकिन क्योंकि सूची वाक्य रचना और अपने "outfix" प्रकार निर्माता एक विशेष मामला, भाषा कल्पना में परिभाषित किया गया है आप इस तरह के एक परिभाषा अपने आप को नहीं लिख सकते हैं।

  • +0

    क्या आप पिछले भाग के बारे में अधिक बता सकते हैं 'ए: [ए]' ए: [] 'खाली सूची '[]' टाइप की गई' [ए] ', परिभाषा' डेटा [] = [] | ए: [ए] ', मुझे विश्वास करने के लिए छोड़ देगा कि यह' [] 'है। क्या '[]', '[ए] 'के लिए भी आवश्यकता पर्याप्त है? –

    +0

    मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। 'ए: [ए]', ':' डेटा कन्स्ट्रक्टर (जैसे 'विपक्ष') को परिभाषित कर रहा है, और '[ए]' कन्स्ट्रक्टर को तर्क के प्रकार को निर्दिष्ट कर रहा है (जैसे 'सूची ए')। परिभाषा के पहले भाग में, '[] 'एक डेटा कन्स्ट्रक्टर है जिसमें कोई तर्क नहीं है, जैसे' शून्य '। दोनों भाग प्रकार '[ए]' के मान उत्पन्न करते हैं, क्योंकि यह वही है जो परिभाषित किया जा रहा है! –

    +3

    शायद आपको क्या ट्रिपिंग कर रहा है यह है कि * डेटा कन्स्ट्रक्टर * * प्रकार कन्स्ट्रक्टर * के पैरामीटर के सभी (या किसी भी) का प्रतिनिधित्व करने वाले पैरामीटर नहीं लेते हैं? डेटा में या तो एक बी = बाएं ए | दाएं बी ', डेटा कन्स्ट्रक्टर' बाएं ए 'अभी भी' या तो बी 'प्रकार का मान बनाता है, भले ही कोई' बी 'न हो। 'कुछ भी नहीं' और '[]' के लिए चला जाता है। आपके पास 'डेटा नोवेल्यू ए बी सी डी ई एफ = लोनली' जैसी कुछ भी हो सकती है। भले ही इसमें कोई मूल्य न हो, फिर भी उन सभी प्रकार के मानकों के दर्शक द्वारा 'अकेला' अभी भी प्रेतवाधित है, इसे किसी भी 'अकेला' से अलग प्रकार के साथ अलग रखा जाता है। –

    18

    प्रकार वर्णन किया गया है (एक GHCi सत्र में) के रूप में:

    $ ghci 
    Prelude> :info [] 
    data [] a = [] | a : [a] -- Defined 
    

    हम भी इसके बारे में सोच सकते हैं, जैसे कि यह रूप में परिभाषित किया गया:

    data List a = Nil 
          | Cons a (List a) 
    

    या

    data List a = EmptyList 
          | ListElement a (List a) 
    

    टाइप कन्स्ट्रक्टर

    [a] एक पॉलिमॉर्फिक डेटा प्रकार है, जिसे उपरोक्त के रूप में [] a भी लिखा जा सकता है। यह है जैसे कि यह List a

    थे इस मामले में के बारे में सोचा जा सकता है, [] एक प्रकार निर्माता एक प्रकार तर्क a लेने और प्रकार [] a है, जो भी [a] रूप में लिखा जा करने की अनुमति है लौटने है।

    एक तरह एक समारोह के प्रकार के बारे में हो सकता है:

    sum :: (Num a) => [a] -> a 
    

    डाटा निर्माता

    [] एक डेटा निर्माता जो अनिवार्य रूप से मतलब है "खाली सूची।" इस डेटा कन्स्ट्रक्टर को कोई मूल्य तर्क नहीं लगता है।

    एक और डेटा कन्स्ट्रक्टर, : है, जो किसी अन्य सूची के सामने एक तत्व तैयार करता है। इस डेटा कन्स्ट्रक्टर के लिए हस्ताक्षर a : [a] है - यह तत्वों और तत्वों की एक और सूची लेता है और तत्वों की परिणामी सूची देता है।

    [] टिप्पणी को एक सूची के निर्माण के लिए के रूप में आशुलिपि इस्तेमाल किया जा सकता है।

    myNums = 3 : 2 : 4 : 7 : 12 : 8 : [] 
    

    जो के रूप में

    myNums = 3 : (2 : (4 : (7 : (12 : (8 : []))))) 
    

    व्याख्या की है लेकिन हास्केल हमें भी परमिट अर्थ में एक समान रूप में आशुलिपि

    myNums = [ 3, 2, 4, 7, 12, 8 ] 
    

    उपयोग करने के लिए है, लेकिन थोड़ा: आम तौर पर हम एक सूची के रूप बनाएगी उपस्थिति, नोटेशन में nicer।

    अस्पष्ट मामला

    एक अस्पष्ट मामला है कि आमतौर पर देखा है: [a]। संदर्भ के आधार पर, इस नोटेशन का अर्थ "a" की सूची या "एक तत्व के साथ एक सूची, अर्थात् a" हो सकती है। पहला अर्थ इरादा अर्थ है जब [a]प्रकार टाइप करता है, जबकि दूसरा अर्थ इच्छित अर्थ है जब [a]मान के भीतर प्रकट होता है।

    +0

    क्या यह 'sum :: (संख्या ए) => [ए] -> ए' (** - ** ** के साथ) होना चाहिए? – psmears

    +0

    @psmears - हाँ, धन्यवाद। – yfeldblum

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