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

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

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

Εισαγωγή

Ένας Αλγεβρικός Τύπος Δεδομένων (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"

Οδηγίες

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

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

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

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

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 Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Haskell Exercism

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

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