Selvä, aloitetaan kuinka löytää alimerkkijono merkkijonosta Haskellissa.
Haskell on puhtaasti toiminnallinen ohjelmointikieli, joka tunnetaan korkeasta abstraktiosta ja ekspressiivisestä syntaksistaan. Yksi yleinen tehtävä merkkijonoja käsiteltäessä on löytää alimerkkijono suuremmasta merkkijonosta – eli tunnistaa tarkka paikka, jossa tietty merkkijono esiintyy.
Tätä tarkoitusta varten voimme hyödyntää kahta sisäänrakennettua Haskell-toimintoa: "isPrefixOf" ja "tails". "isPrefixOf" tarkistaa, onko luettelo toisen luettelon etuliite, ja "tails" luo kaikki luettelon loppuosat. Käytämme myös Data.List-tiedoston elemIndex-funktiota saadaksemme indeksin tietyn elementin ensimmäisestä esiintymisestä.
Tässä on yksinkertainen ratkaisu ongelmaan:
import Data.List
findSubstring :: String -> String -> Maybe Int
findSubstring substr str =
elemIndex True $ map (isPrefixOf substr) (tails str)
Koodin toiminta
Funktiossa "findSubstring" on kaksi argumenttia, "substr" ja "str", jotka edustavat etsimäämme osamerkkijonoa ja vastaavasti merkkijonoa, josta etsimme.
- Ensinnäkin "tails str" luo kaikki mahdolliset str:n päätteet. Jos esimerkiksi merkkijono "hello", "hännät" luovat ["hello", "hello", "llo", "lo", "o", ""].
- Seuraavaksi "map (isPrefixOf substr)" käyttää funktiota "isPrefixOf substr" jokaiseen luettelon elementtiin, jonka "tails str" tuottaa. Tämä tuottaa luettelon Boolen arvoista, joista jokainen osoittaa, onko "substr" alkuperäisen luettelon vastaavan elementin etuliite.
- Lopuksi "elemIndex True" etsii tästä Boolean-luettelosta ensimmäistä "True":n esiintymistä, joka vastaa "substr":n sijaintia "str":ssä, ja palauttaa sen käärittynä "Ehkä"-tietotyyppiin.
Tärkeimmät toiminnot ja kirjastot
Data.List on Haskell-kirjasto, joka on täynnä hyödyllisiä toimintoja luetteloiden käsittelyyn. Se vie muun muassa funktiot "isPrefixOf", "tails" ja "elemIndex", joita käytimme ratkaisussamme.
"isPrefixOf"-toiminto on erityisen tärkeä ratkaisumme kannalta. Tarkistamalla, onko kohdealijonomme jokaisen aliluettelon etuliite, se tarkistaa olennaisesti kaikki mahdolliset alimerkkijonomme aloituskohdat alkuperäisessä merkkijonossa.
Ekstrapolaatiot ja muunnelmat
Tämä yksinkertainen lähestymistapa voidaan ekstrapoloida suorittamaan monimutkaisempia tehtäviä, kuten etsimään kaikki osamerkkijonon esiintymät, korvaamaan osamerkkijonon toisella merkkijonolla tai jakamaan merkkijonon paloiksi erottimen perusteella.
Esimerkiksi, jos haluat korvata kaikki alimerkkijonon esiintymät, voit käyttää Data.List-komentoa "intercalate" yhdistääksesi kappaleet, jotka on saatu katkaisemalla alkuperäinen merkkijono kohdeosamerkkijonon kohdissa.
Luontaisesta yksinkertaisuudestaan ja ilmaisukyvystään huolimatta Haskellin lähestymistapa merkkijonojen käsittelyyn esittelee toiminnallisen ohjelmoinnin tehoa yleisten tehtävien hoitamisessa puhtaalla, luettavalla ja ytimekkäällä tavalla.