Ensinnäkin ongelman ymmärtäminen on äärimmäisen tärkeää. Peräkkäisiä kaksoiskappaleita esiintyy luettelossa, kun sama tietopiste esiintyy kahdessa tai useammassa paikassa taulukossa, mutta vain jos nämä kaksoiskappaleet tapahtuvat peräkkäin. Esimerkiksi luettelossa [1, 2, 2, 3, 2] datapiste '2' on monistettu, mutta sitä ei pidetä peräkkäisenä monistuksena, koska se ei ole rivissä ensimmäisen '2':n kanssa. Lista [1, 2, 2, 3] sisältää kuitenkin parin peräkkäisiä 2-lukuja.
Tätä ongelmaa varten Haskell tarjoaa erittäin joustavan, hyvin optimoidun ratkaisun sisäänrakennetuilla kirjastotoiminnoillaan. Erityisesti 'Data.List'-kirjaston "ryhmä"-toimintoa käytettäisiin.
import Data.List (group) removeDuplicates :: Eq a => [a] -> [a] removeDuplicates = map head . group
Tämä lyhyt, ytimekäs koodinpätkä eliminoi peräkkäiset kaksoiskappaleet jakamalla alkuperäisen luettelon päällekkäisten elementtien aliluetteloihin (ryhmä) ja korvaamalla sitten jokaisen aliluettelon ensimmäisellä elementillä (kartan otsikko).
RemoveDuplicates-toiminnon ymmärtäminen
Saadaksemme paremman käsityksen koodin toiminnasta, rikotaan se.
Tarvittavan kirjaston tuonti: Koodi alkaa sanoilla "import Data.List (group)". Tässä tuomme "ryhmä"-funktion "Data.List"-kirjastosta. "ryhmä" on erittäin kätevä toiminto Haskellissa, joka jakaa luettelon identtisten, vierekkäisten elementtien aliluetteloihin.
Toiminnon määrittäminen: Siirrymme sitten kohtaan "removeDuplicates :: Eq a => [a] -> [a]". Tämä on funktiomme tyyppiilmoitus. Se yksinkertaisesti ilmoittaa, että funktiomme ottaa luettelon mistä tahansa tietotyypistä "a" (jossa "a" on luokan "Eq" jäsen tai sen tasa-arvo voidaan tarkistaa) ja palauttaa saman tietotyypin luettelon.
Yksityiskohtainen selitys vaiheista
Nyt keskitytään kohtaan `removeDuplicates = map head . ryhmä", se on funktiomme määritelmä, joka kuvaa Haskellin toiminnallisten ohjelmointiominaisuuksien kauneutta.
Toiminnan kokoonpano: Lauseke käyttää '.' operaattori, joka Haskellissa tarkoittaa funktion koostumusta. Pohjimmiltaan olemme luomassa uutta toimintoa yhdistämällä "ryhmä" ja "karttapää".
'ryhmä'-toiminto: Funktio 'group' ottaa syöteluettelomme ja jakaa sen alilistoiksi, joissa kaikki identtiset, vierekkäiset elementit on ryhmitelty yhteen.
'karttapää' -toiminto: Sitten "karttapää" menee eteenpäin ja korvaa jokaisen aliluettelon kyseisen aliluettelon ensimmäisellä elementillä - poistaen tehokkaasti kaikki peräkkäiset kaksoiskappaleet. Se on tehty erittäin tehokkaalla tavalla ja on myös luettavissa.
Tämä koodi havainnollistaa, kuinka voimme tehokkaasti käyttää Haskellin monipuolisia kirjastotoimintoja ja toiminnallisia ohjelmointiominaisuuksia tehdäksemme paljon pienellä.
Haskell-kirjastot ja funktiot
Haskellin mahtavuus piilee sen kirjaston tuessa ja sisäänrakennetuissa toiminnoissa. Haskellin Data.List-kirjasto on hyödyllisten toimintojen aarreaitta listankäsittelyyn, "ryhmä" on yksi niistä. Toista toimintoa, 'nub', voidaan myös käyttää poistamaan kaikki kaksoiskappaleet niiden sijainnista riippumatta.
Runsas kirjastovalikoima ja vahvasti kirjoitettu, toimiva ohjelmointitapa tekevät Haskellista erittäin joustavan ja luotettavan kielen todellisten ongelmien ratkaisemiseen. Lisäksi helposti ymmärrettävä syntaksi tekee koodin virheenkorjauksesta ja ymmärtämisestä melko yksinkertaista.