DedSec Project

standard_ml — συγκεντρωτικός οδηγός — DedSec Project

standard_ml — συγκεντρωτικός οδηγός Standard ML Τι προσφέρει η γλώσσα Η Standard ML είναι strict συναρτησιακή γλώσσα με αλγεβρικούς τύπους, pattern matching και στατική εξαγωγή τύπων. Μικρό…

Standard ML

Τι προσφέρει η γλώσσα

Η Standard ML είναι strict συναρτησιακή γλώσσα με αλγεβρικούς τύπους, pattern matching και στατική εξαγωγή τύπων.

Μικρό παράδειγμα προς μελέτη

fun sum [] = 0
  | sum (x::xs) = x + sum xs;
val total = sum [1,2,3];

Παρακολούθησε τις αναδρομικές κλήσεις μέχρι την κενή λίστα και φρόντισε να υπάρχει base case σε κάθε νέα συνάρτηση.

Τι να επαληθεύσεις

Κατάγραψε την πραγματική έκδοση εργαλείου, τις απαιτούμενες εξαρτήσεις και την έξοδο σε δοκιμαστικά δεδομένα για τη Standard_ML. Πρόβλεψε το αποτέλεσμα πριν το ελέγξεις και διατήρησε την αρχική και τη διορθωμένη εκδοχή ώστε να φαίνεται η αιτιώδης διαφορά. Μην αποκαλείς ένα απόσπασμα εκτελεσμένο αν δεν έχεις το κατάλληλο περιβάλλον.

Παγίδα ειδική για το θέμα

Μη εξαντλητικό pattern matching μπορεί να αποτύχει στο runtime· διάβαζε τις προειδοποιήσεις του compiler.

Εργαστήριο εξάσκησης: Standard ML

Πολυμορφική συνάρτηση λίστας

Η Standard ML μπορεί να εκφράσει απουσία χωρίς αυθαίρετη ειδική αριθμητική τιμή. Σε προσωρινό head.sml:

fun safeHead [] = NONE
  | safeHead (x :: _) = SOME x;

val _ = case safeHead [3, 4] of
    SOME 3 => ()
  | _ => raise Fail "unexpected head";

val _ = case safeHead ([] : int list) of
    NONE => ()
  | _ => raise Fail "expected empty";

Αναμένεται εκτέλεση χωρίς εξαίρεση. Η NONE δεν ισοδυναμεί με SOME 0. Η ρητή δήλωση τύπου στην κενή λίστα ξεκαθαρίζει την αναμενόμενη είσοδο του ελέγχου. Τρέξε σε συμβατό SML REPL ή compiler και σημείωσε την υλοποίηση, έκδοση και συμπεριφορά top-level δηλώσεων.

Κάλυψη μοτίβων

Αφαίρεσε προσωρινά τον κανόνα κενής λίστας από τη safeHead. Ο compiler μπορεί να προειδοποιήσει για μη πλήρη patterns, ενώ η κλήση σε [] μπορεί να καταλήξει σε match failure. Μια προειδοποίηση δεν είναι πάντα σκληρό σφάλμα compilation. Κατέγραψε χωριστά την πολιτική warnings και το πραγματικό runtime αποτέλεσμα.

Πολυμορφία και ισότητα

Η safeHead λειτουργεί για πολλούς τύπους επειδή δεν συγκρίνει ή πολλαπλασιάζει στοιχεία. Πρόσθεσε συνάρτηση που ελέγχει αν το πρώτο στοιχείο ισούται με κάποιο δεδομένο, και παρατήρησε ποιον περιορισμό equality types συμπεραίνει ο compiler. Μην υποθέτεις ότι όλοι οι τύποι της SML υποστηρίζουν τον ίδιο τελεστή =.

Αυτοτελής άσκηση

Υλοποίησε safeLast με ξεχωριστή περίπτωση κενής, μονοστοιχειακής και μεγαλύτερης λίστας. Δοκίμασε [], [9], [9,4] και ανάλυσε το κόστος αναδρομής. Φτιάξε δεύτερη υλοποίηση με accumulator και σύγκρινε το συμβόλαιο αποτυχίας. Το nil της λίστας δεν είναι ο option constructor NONE. Πηγή: https://smlfamily.github.io/