Οι φανταστικοί τύποι είναι παράμετροι τύπου ενός προσαρμοσμένου τύπου που δεν χρησιμοποιούνται σε κανέναν από τους κατασκευαστές τιμών αυτού του τύπου.
Αυτό είναι λίγο αφηρημένο, οπότε ορίστε ένα παράδειγμα:
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, τότε μπορούμε να διασφαλίσουμε ότι δεν κατασκευάζονται με μη έγκυρο τύπο μονάδας και ότι μόνο οι συναρτήσεις που ορίστηκαν παραπάνω μπορούν να χρησιμοποιηθούν με αυτές.