Διαδρομές
/
Elm
Elm
/
Ασκήσεις
/
Σεντούκι θησαυρού
Σεντούκι θησαυρού

Σεντούκι θησαυρού

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

Εισαγωγή

Γενικοί τύποι

Εισαγωγή

Οι γενικοί τύποι είναι ένα χαρακτηριστικό της γλώσσας που επιτρέπει την επαναχρησιμοποίηση κώδικα. Για παράδειγμα, δεν θα έπρεπε να έχει σημασία τι τύπο περιέχει μια λίστα για να υπολογίσουμε το μήκος της. Γι' αυτό η συνάρτηση length χρησιμοποιεί μια γενική παράμετρο τύπου a στην υπογραφή τύπου της.

length : List a -> Int

Παράμετροι στους τύπους

Όταν ένας τύπος είναι γενικός ως προς έναν άλλο τύπο, χρησιμοποιούμε ένα πεζό όνομα για αυτόν τον άλλο τύπο και το ονομάζουμε παράμετρο τύπου. Συνήθη παραδείγματα είναι οι προσαρμοσμένοι τύποι List, Maybe και Result.

-- Maybe is generic over the type a
type Maybe a
    = Nothing
    | Just a

someString : Maybe String
someString = Just "hello"

someInt : Maybe Int
someInt = Just 42

Μια σημαντική παρατήρηση για τα ονόματα των παραμέτρων τύπων είναι ότι μπορούν να έχουν πολλούς χαρακτήρες. Ο μόνος περιορισμός είναι ότι πρέπει να είναι πεζά ονόματα. Ως εκ τούτου, όταν είναι χρήσιμο, τείνουμε να τους δίνουμε περιγραφικά ονόματα.

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

-- Result is generic over the types error and value
type Result error value
    = Ok value
    | Err error

Τα ψευδώνυμα τύπων καταγραφών μπορούν επίσης να έχουν παραμέτρους τύπων, αν και είναι λιγότερο συνηθισμένο.

-- Event is generic over the type a
type alias Event a =
    { at : Time
    , data : a 
    }

Παράμετροι τύπων σε συναρτήσεις

Εφόσον οι τύποι μπορούν να είναι γενικοί, το ίδιο μπορούν και οι συναρτήσεις. Μπορούν να γραφτούν συναρτήσεις που χειρίζονται γενικούς τύπους, όπως η Maybe.withDefault.

withDefault : a -> Maybe a -> a
withDefault default maybe =
    case maybe of
      Just value -> value
      Nothing -> default

Οι συναρτήσεις που δέχονται άλλες συναρτήσεις ως παραμέτρους ονομάζονται συναρτήσεις ανώτερης τάξης και αυτές μπορούν επίσης να είναι γενικές.

map : (a -> b) -> Maybe a -> Maybe b
map function maybe =
  case maybe of
    Just value ->
      Just (function value)

    Nothing ->
      Nothing

Οδηγίες

Σε αυτή την άσκηση θα γράψεις ένα γενικευμένο (/ μαγικό!) TreasureChest, για να αποθηκεύσεις λίγο θησαυρό.

1. Όρισε τον γενικευμένο προσαρμοσμένο τύπο TreasureChest

Όρισε έναν προσαρμοσμένο τύπο TreasureChest με μία μόνο παραλλαγή.

Η παραλλαγή θα πρέπει να έχει μια συσχετισμένη τιμή String, η οποία θα χρησιμοποιηθεί για την αποθήκευση του κωδικού πρόσβασης του σεντουκιού του θησαυρού.

Η παραλλαγή θα πρέπει επίσης να έχει μια συσχετισμένη γενικευμένη τιμή, η οποία θα χρησιμοποιηθεί για την αποθήκευση του θησαυρού. Αυτή η τιμή είναι γενικευμένη, ώστε ο θησαυρός να μπορεί να είναι οτιδήποτε.

2. Όρισε τη συνάρτηση getTreasure

Αυτή η συνάρτηση θα πρέπει να δέχεται δύο παραμέτρους

  • μια String (για να δοκιμάσεις έναν κωδικό πρόσβασης)
  • έναν γενικευμένο προσαρμοσμένο τύπο TreasureChest

Αυτή η συνάρτηση θα πρέπει να ελέγχει την προσπάθεια κωδικού πρόσβασης που δίνεται με το String μέσα στο TreasureChest.

Η συνάρτηση θα πρέπει να επιστρέφει ένα Maybe.

Αν οι κωδικοί πρόσβασης ταιριάζουν, τότε επέστρεψε Just με τη γενικευμένη τιμή από το TreasureChest (τον θησαυρό!)

Αν οι κωδικοί πρόσβασης δεν ταιριάζουν, τότε επέστρεψε Nothing.

3. Όρισε τη συνάρτηση multiplyTreasure

Αυτή η (συνάρτηση ανώτερης τάξης) θα πρέπει να δέχεται δύο παραμέτρους

  • μια συνάρτηση πολλαπλασιαστή που δέχεται μία γενικευμένη παράμετρο και επιστρέφει μια λίστα του ίδιου γενικευμένου τύπου
  • έναν γενικευμένο προσαρμοσμένο τύπο TreasureChest, επίσης με τον ίδιο γενικευμένο τύπο

Αυτή η συνάρτηση θα πρέπει να καλεί τη συνάρτηση πολλαπλασιαστή με τον θησαυρό που βρίσκεται στο σεντούκι.

Η συνάρτηση θα πρέπει να επιστρέφει ένα νέο TreasureChest, με τον ίδιο κωδικό πρόσβασης με το αρχικό και με τον πολλαπλασιασμένο θησαυρό (την τιμή επιστροφής)

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Elm Exercism

Έτοιμος να ξεκινήσεις την άσκηση Σεντούκι θησαυρού;

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