Τα Custom Types στην Elm αντιπροσωπεύουν έναν σταθερό αριθμό ονομασμένων περιπτώσεων. Κάθε τιμή αντιστοιχεί σε ακριβώς μία από τις ονομασμένες περιπτώσεις.
Ένας Custom Type ορίζεται με τη λέξη-κλειδί type και απαιτεί ελάχιστη σύνταξη. Αποτελούν μία από τις σημαντικότερες τεχνικές στον προγραμματισμό σε Elm και χρησιμοποιούνται για να ταιριάζουν οι δυνατές τιμές στον κώδικα ακριβώς με τις έγκυρες τιμές στην πραγματική ζωή, κάτι που δεν αφήνει περιθώριο για μη έγκυρα δεδομένα και κάνει τις αδύνατες καταστάσεις αδύνατο να αναπαρασταθούν στον κώδικα.
type Season
= Spring
| Summer
| Autumn
| Winter
Κάθε περίπτωση ενός Custom Type μπορεί προαιρετικά να έχει συνδεδεμένα δεδομένα, και διαφορετικές περιπτώσεις μπορούν να έχουν διαφορετικούς τύπους δεδομένων. Αν καμία από τις περιπτώσεις δεν έχει συνδεδεμένα δεδομένα, η διακριτή ένωση μοιάζει με αυτό που οι άλλες γλώσσες συνήθως αποκαλούν απαρίθμηση (ή enum).
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
Μπορείς να δημιουργήσεις μια τιμή για μια συγκεκριμένη περίπτωση αναφέροντας το όνομά της (Spring), όταν αυτή ορίζεται στο ίδιο άρθρωμα ή έχει εισαχθεί με τη σύνταξη του τύπου import SeasonModule exposing (Season(..)), ή αναφέροντας το πλήρως προσδιορισμένο όνομά της (Season.Spring) όταν έχει εισαχθεί με τη σύνταξη του τύπου import SeasonModule exposing (Season).
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
Τα Custom Types, όπως και τα πάντα στην Elm, έχουν δομική ισότητα, που σημαίνει ότι δύο τιμές για την ίδια περίπτωση και με τα ίδια (προαιρετικά) δεδομένα είναι ισοδύναμες.
Ο προτιμώμενος τρόπος για να δουλέψεις με τα Custom Types είναι η αντιστοίχιση προτύπων:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
Σε αυτή την άσκηση είναι η ημέρα του Αγίου Βαλεντίνου και εσύ και ο/η σύντροφός σου σχεδιάζετε να κάνετε κάτι ωραίο μαζί. Ο/Η σύντροφός σου έχει πολλές ιδέες και τώρα σου ζητάει να τις αξιολογήσεις, ώστε να βρείτε τη δραστηριότητα με την οποία θα ασχοληθείτε.
Ο/Η σύντροφός σου προτείνει τις παρακάτω ιδέες:
Έχεις έξι εργασίες για να σε βοηθήσουν να επιλέξεις τη δραστηριότητα για την ημέρα του Αγίου Βαλεντίνου.
Για κάθε ιδέα που προτείνει ο/η σύντροφός σου, απαντάς με μία από τρεις επιλογές: ναι, όχι ή ίσως.
Όρισε τον Custom Type Approval για να αναπαραστήσεις αυτές τις επιλογές με τις εξής τρεις περιπτώσεις: Yes, No και Maybe.
Ο/Η σύντροφός σου έχει διαλέξει δύο πιθανά εστιατόρια: ένα με κορεάτικη κουζίνα και ένα με τουρκική κουζίνα.
Όρισε τον Custom Type Cuisine για να αναπαραστήσεις αυτές τις κουζίνες με τις εξής δύο περιπτώσεις: Korean και Turkish.
Υπάρχουν άπειρες ταινίες για να διαλέξεις, οπότε για να περιορίσετε τις επιλογές, ο/η σύντροφός σου σου λέει και το είδος τους.
Όρισε τον Custom Type Genre για να αναπαραστήσεις τα παρακάτω είδη ως περιπτώσεις: Crime, Horror, Romance και Thriller.
Όπως είπαμε, ο/η σύντροφός σου έχει σκεφτεί πέντε διαφορετικές δραστηριότητες: να παίξετε ένα επιτραπέζιο, να χαλαρώσετε, να δείτε μια ταινία και να πάτε σε ένα εστιατόριο.
Όρισε τον Custom Type Activity για να αναπαραστήσεις αυτούς τους τύπους δραστηριότητας:
BoardGame: χωρίς συσχετισμένα δεδομένα.Chill: χωρίς συσχετισμένα δεδομένα.Movie: έχει το Genre του ως συσχετισμένα δεδομένα.Restaurant: έχει το Cuisine του ως συσχετισμένα δεδομένα.Επιτέλους, ήρθε η ώρα να αξιολογήσεις τις ιδέες του/της συντρόφου σου. Να τι νιώθεις για κάθε ιδέα του/της συντρόφου σου:
Υλοποίησε μια συνάρτηση με το όνομα rateActivity που παίρνει μια τιμή Activity και επιστρέφει το Approval με βάση τα παραπάνω:
rateActivity (Restaurant Turkish)
-- => Maybe
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elm με 28 έννοιες110 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.