Διαδρομές
/
Elm
Elm
/
Ασκήσεις
/
Ημέρα του Αγίου Βαλεντίνου
Ημέρα του Αγίου Βαλεντίνου

Ημέρα του Αγίου Βαλεντίνου

Άσκηση εκμάθησης

Εισαγωγή

Custom Types

Τα 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"

Οδηγίες

Σε αυτή την άσκηση είναι η ημέρα του Αγίου Βαλεντίνου και εσύ και ο/η σύντροφός σου σχεδιάζετε να κάνετε κάτι ωραίο μαζί. Ο/Η σύντροφός σου έχει πολλές ιδέες και τώρα σου ζητάει να τις αξιολογήσεις, ώστε να βρείτε τη δραστηριότητα με την οποία θα ασχοληθείτε.

Ο/Η σύντροφός σου προτείνει τις παρακάτω ιδέες:

  • Να παίξετε ένα επιτραπέζιο
  • Να χαλαρώσετε
  • Να δείτε μια ταινία
  • Να πάτε σε ένα εστιατόριο

Έχεις έξι εργασίες για να σε βοηθήσουν να επιλέξεις τη δραστηριότητα για την ημέρα του Αγίου Βαλεντίνου.

1. Όρισε την έγκριση

Για κάθε ιδέα που προτείνει ο/η σύντροφός σου, απαντάς με μία από τρεις επιλογές: ναι, όχι ή ίσως.

Όρισε τον Custom Type Approval για να αναπαραστήσεις αυτές τις επιλογές με τις εξής τρεις περιπτώσεις: Yes, No και Maybe.

2. Όρισε τις κουζίνες

Ο/Η σύντροφός σου έχει διαλέξει δύο πιθανά εστιατόρια: ένα με κορεάτικη κουζίνα και ένα με τουρκική κουζίνα.

Όρισε τον Custom Type Cuisine για να αναπαραστήσεις αυτές τις κουζίνες με τις εξής δύο περιπτώσεις: Korean και Turkish.

3. Όρισε τα είδη ταινιών

Υπάρχουν άπειρες ταινίες για να διαλέξεις, οπότε για να περιορίσετε τις επιλογές, ο/η σύντροφός σου σου λέει και το είδος τους.

Όρισε τον Custom Type Genre για να αναπαραστήσεις τα παρακάτω είδη ως περιπτώσεις: Crime, Horror, Romance και Thriller.

4. Όρισε τη δραστηριότητα

Όπως είπαμε, ο/η σύντροφός σου έχει σκεφτεί πέντε διαφορετικές δραστηριότητες: να παίξετε ένα επιτραπέζιο, να χαλαρώσετε, να δείτε μια ταινία και να πάτε σε ένα εστιατόριο.

Όρισε τον Custom Type Activity για να αναπαραστήσεις αυτούς τους τύπους δραστηριότητας:

  • BoardGame: χωρίς συσχετισμένα δεδομένα.
  • Chill: χωρίς συσχετισμένα δεδομένα.
  • Movie: έχει το Genre του ως συσχετισμένα δεδομένα.
  • Restaurant: έχει το Cuisine του ως συσχετισμένα δεδομένα.

5. Αξιολόγησε τη δραστηριότητα

Επιτέλους, ήρθε η ώρα να αξιολογήσεις τις ιδέες του/της συντρόφου σου. Να τι νιώθεις για κάθε ιδέα του/της συντρόφου σου:

  • Να παίξετε ένα επιτραπέζιο: όχι.
  • Να χαλαρώσετε: όχι.
  • Να δείτε μια ταινία: ναι, αν είναι ρομαντική ταινία, αλλιώς όχι.
  • Να πάτε σε ένα εστιατόριο: ναι, αν η κουζίνα είναι κορεάτικη, ίσως αν είναι τουρκική.

Υλοποίησε μια συνάρτηση με το όνομα rateActivity που παίρνει μια τιμή Activity και επιστρέφει το Approval με βάση τα παραπάνω:

rateActivity (Restaurant Turkish)
-- => Maybe
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Elm Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ημέρα του Αγίου Βαλεντίνου;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elm με 28 έννοιες110 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.