Ένας Αλγεβρικός Τύπος Δεδομένων (ADT) αντιπροσωπεύει έναν σταθερό αριθμό ονομασμένων περιπτώσεων. Κάθε τιμή ενός ADT αντιστοιχεί σε ακριβώς μία από τις ονομασμένες περιπτώσεις.
Ένα ADT ορίζεται με τη λέξη-κλειδί data, με τις περιπτώσεις να χωρίζονται με τον χαρακτήρα pipe (|).
Αν καμία από τις περιπτώσεις δεν έχει δεδομένα συνδεδεμένα μαζί της, το ADT μοιάζει με αυτό που οι άλλες γλώσσες συνήθως αποκαλούν απαρίθμηση (ή enum).
data Season
= Spring
| Summer
| Autumn
| Winter
Κάθε περίπτωση ενός ADT μπορεί προαιρετικά να έχει δεδομένα συνδεδεμένα μαζί της, και διαφορετικές περιπτώσεις μπορούν να έχουν διαφορετικούς τύπους δεδομένων. Όταν η περίπτωση έχει συνδεδεμένα δεδομένα, απαιτείται ένας κατασκευαστής.
data Number
= NInt Int --'NInt' is the constructor for an Int Number.
| NFloat Float --'NFloat' is the constructor for an Float Number.
| Invalid --'Invalid' does not have data associated to it.
Η δημιουργία μιας τιμής για μια συγκεκριμένη περίπτωση μπορεί να γίνει αναφέροντας το όνομά της (π.χ., NInt 22).
Καθώς τα ονόματα των περιπτώσεων είναι απλώς συναρτήσεις κατασκευαστών, τα συνδεδεμένα δεδομένα μπορούν να περαστούν ως κανονικό όρισμα συνάρτησης.
Τα ADT έχουν δομική ισότητα, που σημαίνει ότι δύο τιμές για την ίδια περίπτωση και με τα ίδια (προαιρετικά) δεδομένα είναι ισοδύναμες.
Αν και μπορείς να χρησιμοποιήσεις εκφράσεις if/else για να δουλέψεις με ADT, ο προτεινόμενος τρόπος είναι μέσω αντιστοίχισης προτύπων, χρησιμοποιώντας την εντολή case:
add1 :: Number -> String
add1 number =
case number of
NInt i -> show (i + 1)
NFloat f -> show (f + 1.0)
Invalid -> error "Invalid input"
Σε αυτή την άσκηση είναι η ημέρα του Αγίου Βαλεντίνου και σχεδιάζεις τι θα κάνεις με το ταίρι σου. Το ταίρι σου έχει πολλές ιδέες και σου ζητά να τις βαθμολογήσεις, για να βρείτε την καλύτερη δραστηριότητα.
Το ταίρι σου προτείνει τις παρακάτω ιδέες:
Έχεις έξι εργασίες που θα σε βοηθήσουν να επιλέξεις τη δραστηριότητα της ημέρας του Αγίου Βαλεντίνου.
Για κάθε ιδέα που προτείνει το ταίρι σου, απαντάς με μία από τρεις επιλογές: yes, no ή maybe.
Όρισε τον αλγεβρικό τύπο δεδομένων Approval για να αναπαραστήσεις αυτές τις επιλογές με τις εξής τρεις περιπτώσεις: Yes, No ή Maybe.
Το ταίρι σου έχει επιλέξει δύο πιθανά εστιατόρια: ένα με κορεάτικη κουζίνα και ένα με τουρκική κουζίνα.
Όρισε τον αλγεβρικό τύπο δεδομένων Cuisine για να αναπαραστήσεις αυτά τα εστιατόρια με τις εξής δύο περιπτώσεις: Korean ή Turkish.
Υπάρχουν πάρα πολλές ταινίες για να διαλέξεις, οπότε, για να στενέψει ο κύκλος, το ταίρι σου αναφέρει και το αγαπημένο του είδος.
Όρισε τον αλγεβρικό τύπο δεδομένων Genre για να αναπαραστήσεις τις εξής περιπτώσεις ειδών: Crime, Horror, Romance ή Thriller.
Όπως αναφέρθηκε, το ταίρι σου έχει σκεφτεί πέντε πιθανές δραστηριότητες: να παίξεις ένα επιτραπέζιο παιχνίδι, να χαλαρώσεις, να δεις μια ταινία, να πας σε εστιατόριο και να κάνεις μια βόλτα.
Όρισε τον αλγεβρικό τύπο δεδομένων Activity για να αναπαραστήσεις αυτούς τους τύπους δραστηριοτήτων:
BoardGame: χωρίς συσχετισμένα δεδομένα.Chill: χωρίς συσχετισμένα δεδομένα.Movie: έχει το Genre του ως συσχετισμένα δεδομένα.Restaurant: έχει το Cuisine του ως συσχετισμένα δεδομένα.Walk: έχει ένα Int που αντιπροσωπεύει τον αριθμό των χιλιομέτρων που θα περπατήσεις ως συσχετισμένα δεδομένα.Επιτέλους, είσαι έτοιμος να βαθμολογήσεις τις ιδέες του ταιριού σου. Να πώς νιώθεις για την κάθε ιδέα του ταιριού σου:
Υλοποίησε μια συνάρτηση με όνομα rateActivity που παίρνει μια τιμή Activity και επιστρέφει το Approval με βάση τα παραπάνω συναισθήματα.
Για παράδειγμα:
rateActivity (Restaurant Turkish)
-- -> Maybe
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Haskell με 107 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.