Haskell on korkeatasoinen, puhtaasti toimiva ohjelmointikieli, joka on tunnettu yksinkertaisuudestaan ja tyylikkyydestään.. Sen vakiokirjasto tarjoaa runsaan valikoiman toimintoja ja tietotyyppejä, mukaan lukien luettelot, jotka ovat olennaisia monille Haskellin ohjelmointitehtäville. Eräs Haskell-ohjelmoinnin yleinen ongelma liittyy luettelon päähän, eli luettelon ensimmäiseen elementtiin, pääsy. Tämä näennäisesti yksinkertainen toimenpide voi johtaa ajonaikaisiin virheisiin, jos sitä ei käsitellä oikein. Tässä kattavassa oppaassa perehdymme luettelon päähän pääsyn ongelmaan, kuvailemme tehokkaan ratkaisun ja opastamme sinut vaihe vaiheelta siihen liittyvän koodin läpi.
Ongelma, jonka haluamme ratkaista, on kuinka saada turvallisesti Haskellin luettelon pää. Tämä ongelma ilmenee, koska Haskellin vakiopäätoiminto on osittainen, mikä tarkoittaa, että sitä ei ole määritetty jokaiselle mahdolliselle syötteelle. Erityisesti se epäonnistuu tyhjillä listoilla. Tavoitteenamme on luoda funktio, joka on kokonaisvaltainen, eli se käsittelee kaikki mahdolliset syötteet, myös tyhjät listat.
safeHead :: [a] -> Maybe a safeHead [] = Nothing safeHead (x:xs) = Just x
Tämä safeHead-toiminto palauttaa Ei mitään, jos luettelo on tyhjä, ja Just x (jossa x on ensimmäinen kohde), jos luettelo ei ole tyhjä. Tässä Ehkä a on tyyppi, joka edustaa valinnaista arvoa: jokainen Ehkä arvo on joko Ei mitään tai Vain sisältää tyypin a arvon.
Koodin ymmärtäminen: vaihe vaiheelta
Suunnittelimme safeHead-toiminnon käsittelemään kaikkia mahdollisia syötteitä noudattaen Haskellin ja toiminnallisen ohjelmoinnin perusperiaatteita: kaikkien mahdollisuuksien eksplisiittinen käsittely, sivuvaikutusten välttäminen ja koodin luettavuuden maksimointi.
Ensin määritetään funktion tyypin allekirjoitus, safeHead :: [a] -> Ehkä a. Tämä tarkoittaa, että funktio ottaa minkä tahansa tyypin luettelon ([a]) ja palauttaa Ehkä-tyypin. On tärkeää pitää mielessä Haskellin vahva tyyppijärjestelmä, jossa jokaisella Haskellin lausekkeella on tyyppi, joka määritetään käännöshetkellä.
Toimintomme toteutetaan käyttämällä Haskellin avainominaisuutta, kuvioiden sovittamista.
safeHead [] = Nothing safeHead (x:xs) = Just x
Tässä "[]" vastaa tyhjää luetteloa, joten palautamme Ei mitään. "(x:xs)" vastaa ei-tyhjää luetteloa, jonka otsikko on "x" ja loppuosa "xs", ja palautetaan "Just x".
Kirjaston tuki ja muut toiminnot
Maybe-tyyppi on osa Haskellin standardikirjastoa ja sallii ohjelmoijien käsitellä määrittelemättömiä arvoja tai käsitellä tapauksia, kuten meidän, joissa funktiolla ei ehkä ole tarkkaa palautusarvoa kaikille mahdollisille syötteille. Samaan aikaan safeHead-toimintoa voitaisiin luonnollisesti laajentaa käsittelemään muita luettelonkäsittelytoimintoja turvallisesti.
Esimerkiksi safeTail-funktio voitaisiin määritellä seuraavasti:
safeTail :: [a] -> Maybe [a] safeTail [] = Nothing safeTail (x:xs) = Just xs
SafeHead-toimintomme tapaan safeTail palauttaa Ei mitään tyhjälle listalle ja Just xs (luettelo miinus sen ensimmäinen elementti) muussa tapauksessa. Kun olet käsitellyt Haskellin turvallisen luettelokäytön käsitettä, siirrytään vaihteeseen ja syvennytään muodin maailmaan, jossa valinnat ja yhdistelmät voivat olla yhtä monimutkaisia ja runsaita kuin toiminnallinen ohjelmointi.