Haskell on kõrgetasemeline, puhtalt funktsionaalne programmeerimiskeel, mis on tuntud oma lihtsuse ja elegantsi poolest. Selle standardteek pakub rikkalikku valikut funktsioone ja andmetüüpe, sealhulgas loendeid, mis on paljude Haskelli programmeerimisülesannete jaoks olulised. Üks Haskelli programmeerimises sageli esinev probleem hõlmab juurdepääsu loendi peale, st loendi esimesele elemendile. See näiliselt lihtne toiming võib põhjustada käitusvigu, kui seda õigesti ei käsitleta. Selles põhjalikus juhendis süveneme loendi päisele juurdepääsu probleemi, kirjeldame tõhusat lahendust ja juhime teid samm-sammult läbi seotud koodi.
Probleem, mida tahame lahendada, on see, kuidas saada ohutult Haskelli loendi juht. See probleem tekib seetõttu, et Haskelli standardne peafunktsioon on osaline, mis tähendab, et see pole iga võimaliku sisendi jaoks määratletud. Eelkõige ebaõnnestub see tühjade loendite korral. Meie eesmärk on luua täielik funktsioon, mis tähendab, et see käsitleb kõiki võimalikke sisendeid, sealhulgas tühje loendeid.
safeHead :: [a] -> Maybe a safeHead [] = Nothing safeHead (x:xs) = Just x
See safeHead funktsioon tagastab Nothing, kui loend on tühi, ja Just x (millega x on esimene üksus), kui loend pole tühi. Siin on Võib-olla a tüüp, mis esindab valikulist väärtust: iga Võib-olla väärtus on kas Mitte midagi või Lihtsalt sisaldab a-tüüpi väärtust.
Koodi mõistmine: samm-sammult
Kujundasime oma funktsiooni safeHead nii, et see käsitleks kõiki potentsiaalseid sisendeid, järgides Haskelli ja funktsionaalse programmeerimise aluspõhimõtteid: kõigi võimaluste selge käsitlemine, kõrvalmõjude vältimine ja koodi loetavuse maksimeerimine.
Esiteks deklareerime funktsiooni tüübi allkirja, safeHead :: [a] -> Võib-olla a. See tähendab, et funktsioon võtab mis tahes tüüpi loendi ([a]) ja tagastab tüübi Maybe. Oluline on meeles pidada Haskelli tugevat tüübisüsteemi, kus igal Haskelli avaldisel on tüüp, mis määratakse kompileerimise ajal.
Meie funktsiooni rakendamine toimub mustrite sobitamise abil, mis on Haskelli põhifunktsioon.
safeHead [] = Nothing safeHead (x:xs) = Just x
Siin vastab „[]” tühjale loendile, seega tagastame Mitte midagi. „(x:xs)” vastab mittetühjale loendile, mille pea on „x” ja saba „xs” ning tagastame „Just x”.
Raamatukogu tugi ja muud funktsioonid
Tüüp Maybe on osa Haskelli standardteegist ja võimaldab programmeerijatel käsitleda määratlemata väärtusi või käsitleda juhtumeid, nagu meie oma, kui funktsioonil ei pruugi olla kõigi võimalike sisendite jaoks täpselt määratletud tagastusväärtust. Samal ajal saab funktsiooni safeHead loomulikult laiendada, et täiendavaid loenditöötlustoiminguid ohutult käsitleda.
Näiteks funktsiooni safeTail võib määratleda järgmiselt:
safeTail :: [a] -> Maybe [a] safeTail [] = Nothing safeTail (x:xs) = Just xs
Nagu meie funktsioon safeHead, tagastab safeTail tühja loendi korral Nothing ja muidu tagastab Just xs (loend miinus selle esimene element). Olles käsitlenud Haskelli turvalise juurdepääsu kontseptsiooni loendisse, vahetame käiku ja süveneme moevaldkonda, kus valikud ja kombinatsioonid võivad olla sama keerulised ja rikkalikud kui funktsionaalse programmeerimise puhul.