Olen aina ollut sitä mieltä, että Haskell on yksinkertainen kieli ja siinä vain tarvitsee kertoa, miten asiat ovat (esimerkiksi, x `nand` y = not $ x && y). Mutta nyt olen alkanut kiinnittää huomiota siihen, että ihmiset teettävät Haskellilla aikamoisen määrän koodia käyttäen avukseen sen tyyppijärjestelmässä olevia oletusmäärittelyitä erilaisille tyyppiluokille. Nämä tyyppiluokat taas on osittain nimetty matemaattisilla termeillä, osittain ohjelmointitermeillä, ja niillä on kirjastossa hirveä määrä instansseja, jotka pitäisi tuntea, jotta ymmärtää, mitä tapahtuu. Melko kevyt esimerkki:
Prelude Data.Foldable Data.Monoid> isNice = foldMap (Any.) [(< 1), (> 10), even] Prelude Data.Foldable Data.Monoid> isNice 3 Any {getAny = False} Prelude Data.Foldable Data.Monoid> isNice (-3) Any {getAny = True}
Jotta ymmärtäisi mitä tässä koodissa tapahtuu, pitää:
Tämä on kätevää, mutta vaikeaselkoista. Vielä vaikeampaa on osata etsiä Haskellin peruskirjastosta ne määrittelyt, joilla siistisi oman pikku koodinpätkänsä. Eli tavallaan: sama ongelma kuin funktionaalisissa kielissä aikaisemminkin. Valtava perussanasto joka pitää opetella, jotta pystyy ilmaisemaan itseään tiiviisti ja kauniisti. Tällä kertaa soppaan lisätään vielä se, että samat sanat tarkoittavat äärettömän monta eri asiaa riippuen siitä, millaista tietoa ne käsittelevät.
Prelude Data.Functor.Const> fmap (+1) (Const 3) Const 3 Prelude Data.Functor.Const> fmap (+1) (Just 3) Just 4
Toisaalta, olen aina ollut sitä mieltä, että funktionaalisten kielten perussanasto ilmentää tärkeitä asioita laskennasta ja algoritmeista. On hyvä, että erilaisille patterneille on omat sanansa, koska silloin niiden samankaltaisuus sekä tunnistetaan että ei tarvitse toistaa itseään (kirjoittamalla niitä samankaltaisia asioita uudestaan). Sovellettuna tähän Haskellin kirjasto-ongelmaan tämä tarkoittaa, että Haskellin peruskirjastoa kannattaa opiskella jo siksi, että ymmärtäisi paremmin todellisuuden rakennetta. (Yksi paikka opiskella todellisuuden rakennetta on tämä: https://wiki.haskell.org/Typeclassopedia)
Mutta kaipaisin sellaista johdantoa Haskelliin, joka kävisi peruskirjastoa läpi jotenkin yhtenäisesti. En tiedä, onko se oikein mahdollista. Siellä on vain hirveästi hyödyllistä kamaa. Sitten, kun on opetellut kaiken, muistaa varmasti oikealla hetkellä esimerkiksi, että tämä generoi binäärilukuja?
Prelude> traverse (\_ -> ".x") [0..4] [".....","....x","...x.","...xx","..x..","..x.x","..xx.","..xxx", ".x...",".x..x",".x.x.",".x.xx",".xx..",".xx.x",".xxx.",".xxxx", "x....","x...x","x..x.","x..xx","x.x..","x.x.x","x.xx.","x.xxx", "xx...","xx..x","xx.x.","xx.xx","xxx..","xxx.x","xxxx.","xxxxx"]