ocaml — συγκεντρωτικός οδηγός — DedSec Project
ocaml — συγκεντρωτικός οδηγός OCaml Έννοια Η OCaml συνδυάζει αλγεβρικούς τύπους, pattern matching και modules και υποστηρίζει λειτουργικό και προστακτικό ύφος. Παράδειγμα πηγαίου κώδικα ή…
OCaml
Έννοια
Η OCaml συνδυάζει αλγεβρικούς τύπους, pattern matching και modules και υποστηρίζει λειτουργικό και προστακτικό ύφος.
Παράδειγμα πηγαίου κώδικα ή χρήσης
let rec length = function
| [] -> 0
| _ :: xs -> 1 + length xs;;
Άσκηση με συγκεκριμένο στόχο
Παρακολούθησε αναδρομή σε κενή και τριμελή λίστα και παρατήρησε warning για ελλιπές match.
Έλεγχος και διάγνωση
Μην κρύβεις ελλιπές pattern matching με τυφλό wildcard· κάλυψε τους πραγματικούς constructors.
Σημείωσε την είσοδο, το αναμενόμενο αποτέλεσμα και το πραγματικό αποτέλεσμα στην εγκατεστημένη έκδοση της OCaml. Αν ο κώδικας δεν είναι προσβάσιμος από το κινητό, κράτησε το παράδειγμα ως μη δοκιμασμένο και εξήγησε τη σημασιολογία αντί να ισχυριστείς επιτυχία. Κάνε μια δεύτερη δοκιμή που απομονώνει μόνο τον μηχανισμό της άσκησης και κράτησε ακριβές σφάλμα με τρόπο που να μην εκθέτει προσωπικά δεδομένα.
OCaml — Αναλυτικός οδηγός εξάσκησης
Ένα σαφές συμβόλαιο για παρονομαστή μηδέν
Οι ακέραιοι OCaml έχουν πεπερασμένο εύρος και η διαίρεση με μηδέν δεν πρέπει να κρύβεται. Στο safe_div.ml:
let safe_div a b =
if b = 0 then None else Some (a / b)
let () =
assert (safe_div 9 2 = Some 4);
assert (safe_div 9 0 = None);
assert (safe_div (-7) 2 = Some (-3));
print_endline "checks passed"
Δοκίμασε ocaml safe_div.ml. Η ακέραια διαίρεση OCaml αποκόπτει προς το μηδέν: η -7 / 2 δίνει -3. Μην τη συγχέεις με μαθηματική στρογγυλοποίηση προς το αρνητικό άπειρο. Η None σημαίνει αποτυχία και όχι αριθμητικό μηδέν. Σημείωσε έκδοση runtime και πραγματικά αποτελέσματα.
Πλήρης αντιστοίχιση παραλλαγών
Φτιάξε let show = function None -> "invalid" | Some n -> string_of_int n. Ο κανόνας καλύπτει τις δύο πιθανές κατασκευές. Αφαίρεσε προσωρινά τη None και παρατήρησε το warning για μη πλήρες pattern. Προσοχή: warning δεν συνεπάγεται πάντα σφάλμα compilation, εκτός αν η διαμόρφωση το απαιτεί. Εξήγησε ποια είσοδος μπορεί να καταλήξει σε Match_failure.
Καθαρές τιμές και παρενέργειες
Η safe_div υπολογίζει option χωρίς να εκτυπώνει. Το μπλοκ let () = εκτελεί assertions και output. Σύγκρινε με υλοποίηση που πετά εξαίρεση και εξήγησε γιατί ο καλών της option εκδοχής μπορεί να αποφασίσει μέσω pattern matching. Δοκίμασε πολλές εισόδους διατηρώντας το ζεύγος αριθμών κάθε αιτήματος.
Οριακή άσκηση
Εξέτασε max_int και min_int: οι ακέραιοι δεν αναπαριστούν οποιοδήποτε μαθηματικό αριθμό. Πρόσθεσε αρνητικό παρονομαστή, μηδενικό αριθμητή και κενή λίστα αιτημάτων. Δήλωσε ποιες περιπτώσεις δοκιμάστηκαν πραγματικά και ποιες αποτελούν στατική ανάλυση. Πηγή: https://ocaml.org/docs