2017-05-04 9 views
5

मुझे एल्म में यूनियन प्रकारों के आसपास अपने सिर को लपेटने में कुछ परेशानी हो रही है। मैं की तरहएल्म यूनियन प्रकारों को समझना

type Visibility = All | Active | Completed 

सरल उपयोग के मामले को समझने तो इसका मतलब है कि दृश्यता का मूल्य सभी, सक्रिय या पूर्ण हो सकता है। अब तक सब ठीक है। मैं कहाँ भ्रमित हो लेकिन

type Msg 
    = OnFetchMails (WebData (List Mail)) 
    | OnFetchSmss (WebData (List SMS)) 

मैं इस व्याख्या चाहिए कैसी है? क्या इसका मतलब है कि संदेश प्रकार फ़ंक्शन ऑनफैचमेल्स का हो सकता है जो एक प्रकार का फ़ंक्शन वेबडाटा लेता है जो मेल की सूची लेता है? या मुझे इसकी व्याख्या कैसे करनी चाहिए? मुझे नहीं लगता कि (WebData (List Mail)) पेलोड है?

अजीब पर्याप्त मैं इसे समझ यह

उत्तर

6

असल में, हाँ, आप इसके बारे में एक पेलोड कि प्रत्येक शाखा के साथ चला जाता के रूप में सोच सकते हैं के बिना काम करने के लिए मिल सकता है।

type Msg 
    = OnFetchMails (WebData (List Mail)) 
    | OnFetchSmss (WebData (List SMS)) 

मतलब है कि प्रकार Msg के एक मूल्य या तो OnFetchMails है, जो उसके साथ कार्य करने प्रकार WebData (List Mail) के कुछ मूल्य होगा हो सकता है; या यह OnFetchSmssWebData (List SMS) के साथ हो सकता है।

वे कभी कभी कहा जाता है में चिह्नित यूनियनों, के रूप में वे एक सी शैली union निर्माण एक टैग मूल्य के साथ बंडल जो कहते हैं संघ में जो विकल्प वर्तमान में मान्य एक है की तरह एक बहुत काम करते हैं (और वास्तव में इस तरह की संरचना के साथ कई भाषाओं में उन्हें लागू करने के लिए)।

उन्हें एक सार आधार Msg प्रकार के उप-वर्गों की एक श्रृंखला के रूप में भी मॉडल किया जा सकता है, प्रत्येक उपclass में उनके पेलोड के लिए भंडारण जोड़ना और पेलोड को कन्स्ट्रक्टर पैरामीटर के रूप में प्रदान करने की आवश्यकता होती है।

8

यूनियन प्रकार को परिभाषित करते समय, आप उस प्रकार के मान को बनाने के सभी तरीकों की सूची देते हैं। इसके सरलतम रूप में, कि परिभाषा इस तरह दिखता है:

type Visibility 
    = All 
    | Active 
    | Completed 

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

type TrainStatus 
    = OnTime 
    | Delayed Int 

आप उम्मीद करेंगे के रूप में, यह दो नई परिभाषित करता है OnTime और Delayed "कंस्ट्रक्टर्स,":

यहाँ थोड़ी ज्यादा जटिल संघ प्रकार परिभाषा है। लेकिन उनकी प्रकार को देखो:

OnTime : TrainStatus 
Delayed : Int -> TrainStatus 

OnTime निर्माता शून्य तर्क लेता है, और इसलिए बस एक मूल्य है, यह पहले से ही TrainStatus है। लेकिन Delayed को एक-तर्क कन्स्ट्रक्टर के रूप में घोषित किया गया है: यह फ़ंक्शन है जो Int में से एक नया TrainStatus बनाता है। इस प्रकार, Delayed 5, Delayed 10, और Delayed 100 सभी मान्य TrainStatus मान हैं। (हम उन्हें "5 मिनट तक देरी" या कुछ समान के रूप में व्याख्या कर सकते हैं।)

एक निर्माता कई तर्क ले सकता है; उदाहरण के लिए, हम शामिल करना चाहते हैं, एक स्ट्रिंग, एक देरी के लिए एक कारण के रूप में यदि:

type TrainStatus 
    = OnTime 
    | Delayed Int String 

ts : TrainStatus 
ts = Delayed 20 "The conductor took a short nap." 

जो Delayed : Int -> String -> TrainStatus परिभाषित करता है।

आप एक TrainStatus दिया जाता है, तो आप पैटर्न मिलान का उपयोग कर Int और String इसके अंदर निकाल सकते हैं:

case ts of 
    OnTime -> 
    "Your train is on time!" 

    Delayed minutes reason -> 
    "Your train has been delayed by " ++ toString minutes ++ " because " ++ reason