Funktionaalisen ohjelmoinnin maailmassa konseptit kehittyvät eri tavalla. Niiden joukossa harvat saattavat vaikuttaa yhtä abstraktilta ja vaikeasti ymmärrettäviltä kuin se, jonka aiomme selvittää tänään – Functor. Mutta kun ymmärrät sen tehon ja joustavuuden, toimijat voivat yksinkertaistaa ratkaisusi huomattavasti monimutkaisiin ohjelmointihaasteisiin.
Funktorien ymmärtäminen Haskellissa
Funktori on Haskellissa tyyppi, joka toteuttaa Functor tyyppiluokka. Se on pohjimmiltaan jotain, joka voidaan kartoittaa. Functor sisältää kaksi ensisijaista elementtiä, "fmap"-funktion ja joitain lakeja, jotka varmistavat johdonmukaisen toiminnan.
'fmap':lla käytetään funktiota rakenteen sisällä olevaan arvoon muuttamatta itse rakennetta. Tämä tarkoittaa, että funktionaaliset kapseloivat kontekstin vaikuttavat toiminnot jättäen kontekstin ennalleen. Sen avulla voimme keskittyä ongelmanratkaisuun sotkeutumatta kontekstin käsittelyyn.
instance Functor Maybe where
fmap func (Just x) = Just (func x)
fmap func Nothing = Nothing
Funktorin lait
Jotta tyyppi kelpuutetaan funktoriksi, sen on täytettävä kaksi lakia, jotka tunnetaan nimellä Funktorin lait. Nämä lait turvaavat työskentelemämme rakenteen eheyden.
Sääntö 1: Identiteettifunktion kartoittaminen funktorin päälle pitäisi palauttaa alkuperäisen funktorin – fmap id == id
fmap id (Just 3) -- Returns: Just 3 fmap id Nothing -- Returns: Nothing
Sääntö 2: Kahden funktion muodostamisen ja sen jälkeen tuloksena olevan funktion yhdistämisen funktorin päälle pitäisi olla sama kuin ensin yhden funktion kartoittaminen ja sitten toisen kartoituksen - fmap (f . g) == fmap f . fmap g
fmap (abs . negate) (Just 5) -- Returns: Just 5 (fmap abs . fmap negate) (Just 5) -- Returns: Just 5
Funktorien käyttäminen ongelmien ratkaisemiseen
Havainnollistetaan nyt, kuinka Funktorit voivat ratkaista ongelmia tehokkaasti. Oletetaan esimerkiksi, että meillä on luettelo mahdollisista tuloksista luettelona Ehkä-arvoista. Jos haluamme kasvattaa kutakin yhdellä, normaalisti meidän on kirjoitettava paljon kattilakoodia. Syötä Functors.
"fmap" voi helposti iteroida luettelon yli ohittaen Nothing-arvot ja soveltamalla toimintoa vain Just-arvoihin. Kaikki säilyttäen alkuperäisen rakenteen.
let maybes = [Just 1, Nothing, Just 3] fmap (+1) <$> maybes -- Returns: [Just 2, Nothing, Just 4]
Funktorit tarjoavat siis virtaviivaisen, älykkään tavan hallita laskelmia kontekstin sisällä. Ne ovat olennainen osa Haskellin kykyä käsitellä monimutkaisia tehtäviä yksinkertaisella, tyylikkäällä koodilla.