फैंटम टाइप किसी कस्टम टाइप के ऐसे टाइप पैरामीटर होते हैं जिनका उपयोग उस टाइप के किसी भी वैल्यू कंस्ट्रक्टर में नहीं किया जाता।
यह थोड़ा अमूर्त है, तो चलिए एक उदाहरण देखते हैं:
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 वैल्यू नहीं बना सकते, तो हम यह सुनिश्चित कर सकते हैं कि वे किसी अमान्य यूनिट टाइप के साथ न बनें, और उनके साथ सिर्फ ऊपर बताए गए फंक्शन ही इस्तेमाल किए जा सकें।
लूसी का स्टिकर की एक ऑनलाइन दुकान है, जहाँ वह हर किसी की पसंदीदा प्रोग्रामिंग भाषाओं वाले प्यारे स्टिकर बेचती है। दुनिया भर से लोग उसके स्टिकर खरीदते हैं, और अलग-अलग मुद्राओं को संभालने में उसे थोड़ी परेशानी हो रही है।
ऐसा प्रोग्राम बनाइए जिससे लूसी कीमतों की गणना कर सके और यह भी सुनिश्चित कर सके कि वह हमेशा सही मुद्रा ही इस्तेमाल कर रही है।
Usd, Eur, और Jpy टाइप बनाइएये टाइप उन अलग-अलग मुद्राओं को दर्शाने के लिए इस्तेमाल होते हैं जिनसे लूसी के ग्राहक उसके स्टिकर खरीदते हैं।
इन्हें फैंटम टाइप के रूप में इस्तेमाल किया जाना है और इनमें किसी कंस्ट्रक्टर की ज़रूरत नहीं है।
Money टाइप बनाइए।Money टाइप में पैसे की राशि के लिए एक Int फील्ड होना चाहिए, एक मुद्रा फैंटम टाइप पैरामीटर होना चाहिए, और यह एक ओपेक टाइप होना चाहिए।
dollar, euro, और yen फंक्शन बनाइएdollar, euro, और yen फंक्शन बनाइए जो एक Int आर्गुमेंट लेते हैं और सही मुद्रा वाली एक Money वैल्यू लौटाते हैं।
total फंक्शन बनाइएtotal फंक्शन बनाइए जो Money वैल्यू का एक ऐरे लेता है और ऐरे में मौजूद कुल राशि लौटाता है।
total([euro(120), euro(200), euro(145)])
// -> euro(465)
Exercism पर साइन अप कीजिए और Gleam को 33 कॉन्सेप्ट122 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।