haskell — συγκεντρωτικός οδηγός — DedSec Project
haskell — συγκεντρωτικός οδηγός Haskell Βασική ιδέα Η Haskell είναι lazy functional γλώσσα με ισχυρούς τύπους και ρητή μοντελοποίηση effects. Μικρό εκπαιδευτικό απόσπασμα Άσκηση βασισμένη…
Haskell
Βασική ιδέα
Η Haskell είναι lazy functional γλώσσα με ισχυρούς τύπους και ρητή μοντελοποίηση effects.
Μικρό εκπαιδευτικό απόσπασμα
sumSquares xs = sum (map (^2) xs)
Άσκηση βασισμένη στη συγκεκριμένη συμπεριφορά
Δοκίμασε κενή και τριμελή λίστα και εξήγησε επίδραση laziness στη μνήμη.
Διάγνωση και όρια
Η purity δεν εξαλείφει nontermination ή space leaks· μελέτησε evaluation/strictness.
Κάνε την άσκηση με πραγματικά δοκιμαστικά δεδομένα και με έκδοση Haskell που ταιριάζει στον κώδικα. Σημείωσε μία αρχική πρόβλεψη και την πραγματική έξοδο. Για περίπλοκο ή μη διαθέσιμο runtime, παρουσίασε τη στατική ανάλυση ως τέτοια, όχι ως επιτυχημένη εκτέλεση. Δοκίμασε ξεχωριστά την κανονική περίπτωση και μία οριακή τιμή, χωρίς πραγματικά προσωπικά ή παραγωγικά δεδομένα.
Haskell — Αναλυτικός οδηγός εξάσκησης
Σαφές συμβόλαιο επιστροφής
Σε προσωρινό Main.hs δήλωσε ρητά τον τύπο. Η διαίρεση με μηδέν πρέπει να αποτυπώνεται στο αποτέλεσμα αντί να αποκρύπτεται:
safeDiv :: Int -> Int -> Maybe Int
safeDiv _ 0 = Nothing
safeDiv a b = Just (a `div` b)
main :: IO ()
main = do
print (safeDiv 12 3)
print (safeDiv 12 0)
print (safeDiv (-7) 2)
Με GHC μπορείς να δοκιμάσεις runghc Main.hs. Προβλέπονται Just 4, Nothing, Just (-4). Η ακέραια div στρογγυλεύει προς το αρνητικό άπειρο, ενώ η quot αποκόπτει προς το μηδέν. Έλεγξε την αρνητική περίπτωση πριν χρησιμοποιήσεις τέτοιες πράξεις σε πραγματικά δεδομένα. Δεν ισχυριζόμαστε ότι το δείγμα εκτελέστηκε εδώ.
Σειρά κανόνων και κάλυψη μοτίβων
Η πρώτη εξίσωση χειρίζεται παρονομαστή μηδέν, η δεύτερη όλα τα υπόλοιπα. Αν βάλεις γενικό κανόνα πρώτα, ένας μεταγενέστερος ειδικός μπορεί να μη χρησιμοποιηθεί ποτέ. Μετέτρεψε τις παραμέτρους από Int σε Integer και εξήγησε ότι έτσι αλλάζει το αριθμητικό εύρος, αλλά όχι το συμβόλαιο Maybe.
Προβληματική μερική συνάρτηση
Δοκίμασε head [] μόνο σε απομονωμένο REPL και κράτησε τη διάγνωση. Σχεδίασε ύστερα safeHead :: [a] -> Maybe a με ξεχωριστά μοτίβα [] και x:_. Δοκίμασε [], [9] και [9,4]. Η δυνατότητα μεταγλώττισης μιας συνάρτησης δεν αποδεικνύει ότι ορίζεται για κάθε νόμιμη τιμή εισόδου.
Άσκηση με περιγραφή αποτυχίας
Αντικατάστησε το αποτέλεσμα με Either String Int, επιστρέφοντας Left για μηδενικό παρονομαστή και Right για έγκυρο αποτέλεσμα. Έλεγξε θετικούς, αρνητικούς και οριακούς αριθμούς, καταγράφοντας την έκδοση GHC. Μην κρύβεις σφάλματα με γενικό exception handler όταν μπορείς να τα εκφράσεις στον τύπο. Αναφορές: https://www.haskell.org/documentation/ και https://downloads.haskell.org/ghc/latest/docs/libraries/
Haskell — Παραδείγματα πραγματικού κώδικα
Εκτέλεση των παραδειγμάτων
Τα παραδείγματα είναι μικρά και αυτοτελή. Χρησιμοποίησε τη σχετική εγκατεστημένη γλώσσα. Ενδεικτικά: runghc {file}. Μη συγχέεις τα ονόματα αρχείων με αυτόματη εγκατάσταση. Δούλεψε σε δοκιμαστικό φάκελο.
Haskell — Τεχνικά σημεία και συχνές παγίδες
Τεχνική γνώση
- Η καθαρότητα ξεχωρίζει υπολογισμούς από πράξεις IO.
- Η τεμπέλικη αξιολόγηση αναβάλλει δουλειά και μπορεί να επηρεάσει τη μνήμη.
- Οι αλγεβρικοί τύποι και το pattern matching περιγράφουν σαφείς περιπτώσεις.