ट्रैक
/
Gleam
Gleam
/
सिलेबस
/
फैंटम टाइप
फै

फैंटम टाइप में Gleam

1 अभ्यास

फैंटम टाइप के बारे में

फैंटम टाइप किसी कस्टम टाइप के ऐसे टाइप पैरामीटर होते हैं जिनका उपयोग उस टाइप के किसी भी वैल्यू कंस्ट्रक्टर में नहीं किया जाता।

यह बात थोड़ी अमूर्त है, इसलिए यहाँ एक उदाहरण देखिए:

pub type Length(unit) {
  Length(amount: Float)
}

इस उदाहरण में unit टाइप पैरामीटर का उपयोग Length वैल्यू कंस्ट्रक्टर में नहीं किया गया है, इसलिए unit एक फैंटम टाइप है।

यह अप्रयुक्त टाइप पैरामीटर बेकार लग सकता है, लेकिन इसका उपयोग इस बात पर और प्रतिबंध लगाने के लिए किया जा सकता है कि Length वैल्यू का इस्तेमाल कैसे किया जा सकता है।

उदाहरण के लिए, हमारे पास एक फंक्शन double हो सकता है, जो लंबाई को दोगुना करता है। यह किसी भी यूनिट की लंबाई के साथ काम करता है, इसलिए यहाँ टाइप पैरामीटर एक जेनेरिक टाइप वेरिएबल है।

// This function accepts all Length values
pub fn double(length: Length(unit)) -> Length(unit) {
  Length(length.amount *. 2.0)
}

हम एक फंक्शन add_inch भी बना सकते हैं, जो तभी काम करता है जब लंबाई इंच में हो।

// A unit type for inches. It is never constructed so we don't
// define any constructors for it.
pub type Inches

pub fn add_inch(length: Length(Inches)) -> Length(Inches) {
  Length(length.amount +. 1.0)
}

फंक्शन add_inch किसी और यूनिट पैरामीटर वाली लंबाई स्वीकार नहीं करेगा। यहाँ फैंटम टाइप का उपयोग यह सुनिश्चित करने के लिए किया गया है कि केवल सही यूनिट का ही इस्तेमाल हो।

एक फंक्शन ऐसा भी लिखा जा सकता है जो यह सुनिश्चित करे कि दो लंबाई वैल्यू एक ही यूनिट की हों, और इसके लिए दोनों में एक ही टाइप वेरिएबल इस्तेमाल किया जाए।

pub fn add(a: Length(unit), b: Length(unit)) -> Length(unit) {
  Length(a.amount +. b.amount)
}
let two_meters: Length(Meters) = Length(2.0)
let two_inches: Length(Inches) = Length(2.0)

add(two_meters, two_meters)
// -> Length(4.0): Length(Meters)

add(two_meters, two_inches)
// Type error! The unit type parameters do not match.

फैंटम टाइप ओपेक टाइप के साथ अच्छी तरह काम करते हैं। अगर दूसरे मॉड्यूल Length वैल्यू नहीं बना सकते, तो हम यह सुनिश्चित कर सकते हैं कि वे किसी अमान्य यूनिट टाइप के साथ न बनें, और उनके साथ केवल ऊपर बताए गए फंक्शन ही इस्तेमाल किए जा सकें।

GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

फैंटम टाइप सीखिए