الأنواع الوهمية هي معاملات نوع في نوع مخصص لا تُستخدم في أي من مُنشئات القيم الخاصة بذلك النوع.
قد يبدو هذا مجردًا بعض الشيء، فإليك مثال:
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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.