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

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

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

Εισαγωγή

Διακριτές ενώσεις

Ο τύπος διακριτής ένωσης αντιπροσωπεύει έναν σταθερό αριθμό ονομαζόμενων περιπτώσεων. Κάθε τιμή μιας διακριτής ένωσης αντιστοιχεί σε ακριβώς μία από τις ονομαζόμενες περιπτώσεις.

Μια διακριτή ένωση ορίζεται με τη λέξη-κλειδί type, με τις περιπτώσεις να χωρίζονται από χαρακτήρες κάθετης γραμμής (|):

type Season =
    | Spring
    | Summer
    | Autumn
    | Winter

Κάθε περίπτωση μιας διακριτής ένωσης μπορεί προαιρετικά να έχει συνδεδεμένα δεδομένα, και διαφορετικές περιπτώσεις μπορούν να έχουν διαφορετικούς τύπους δεδομένων. Αν καμία από τις περιπτώσεις δεν έχει συνδεδεμένα δεδομένα, η διακριτή ένωση μοιάζει με αυτό που άλλες γλώσσες συνήθως αποκαλούν απαρίθμηση (ή enum).

type Number =
    | Integer of int
    | Float of float
    | Invalid

Μπορείς να δημιουργήσεις μια τιμή για μια συγκεκριμένη περίπτωση αναφέροντας το όνομά της (π.χ. Success). Επειδή τα ονόματα των περιπτώσεων είναι απλώς συναρτήσεις κατασκευαστές, τα συνδεδεμένα δεδομένα μπορούν να περαστούν ως κανονικό όρισμα συνάρτησης. Αν μια άλλη διακριτή ένωση έχει ορίσει μια περίπτωση με το ίδιο όνομα, θα χρειαστεί να χρησιμοποιήσεις το πλήρες όνομά της (π.χ. Result.Success).

let byName = Integer 2
let byFullName = Number.Invalid

Οι διακριτές ενώσεις έχουν δομική ισότητα, που σημαίνει ότι δύο τιμές για την ίδια περίπτωση και με τα ίδια (προαιρετικά) δεδομένα είναι ισοδύναμες.

Παρόλο που μπορείς να χρησιμοποιήσεις εκφράσεις if/elif/else για να δουλέψεις με διακριτές ενώσεις, ο συνιστώμενος τρόπος είναι μέσω αντιστοίχισης προτύπων χρησιμοποιώντας το πρότυπο αναγνωριστικού:

let describe number =
    match number with
    | Integer i -> sprintf "Integer: %d" i
    | Float d  -> sprintf "Float: %f" d
    | Invalid   -> "Invalid"

Οδηγίες

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

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

  • Παιχνίδι επιτραπέζιου
  • Χαλάρωση
  • Ταινία
  • Εστιατόριο
  • Βόλτα

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

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

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

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

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

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

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

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

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

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

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

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

Όρισε τη διακριτή ένωση Activity που αναπαριστά αυτούς τους τύπους δραστηριοτήτων:

  • BoardGame: χωρίς συσχετισμένα δεδομένα.
  • Chill: χωρίς συσχετισμένα δεδομένα.
  • Movie: διαθέτει συσχετισμένα δεδομένα τύπου Genre.
  • Restaurant: διαθέτει συσχετισμένα δεδομένα τύπου Cuisine.
  • Walk: διαθέτει συσχετισμένα δεδομένα τύπου int που αναπαριστούν τον αριθμό των χιλιομέτρων που θα περπατήσετε.

5. Βαθμολόγησε τη δραστηριότητα

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

  • Παιχνίδι επιτραπέζιου: no.
  • Χαλάρωση: no.
  • Ταινία: yes αν είναι ρομαντική ταινία, αλλιώς no.
  • Εστιατόριο: yes αν η κουζίνα είναι κορεάτικη, maybe αν είναι τουρκική.
  • Βόλτα: yes αν η βόλτα είναι λιγότερο από τρία χιλιόμετρα, maybe αν είναι λιγότερο από πέντε χιλιόμετρα, αλλιώς no.

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

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

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

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