(toiminnot)

hwechtla-tl: Nettipäiväkirja 30.07.2018

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


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ää:

  1. tajuta, että foldMap käyttää avukseen jotain Monoid-luokan tyyppiä
  2. tietää, mitä Any-luokka tekee (= mikä sen Monoid-instanssin määrittely on)
  3. tietää, että funktioilla on oletuksena Monoid-instanssi, ja miten se on määritelty
  4. osata lukea kompositio-operaattorin osittaissovelluksia (Any.)

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"]


kommentoi (viimeksi muutettu 31.07.2018 15:51)