Kuinka puhtaasti toimiva ohjelmointikieli voi muuttaa elämääsi.

Uskon, että kaikkien tulisi oppia Haskell, vaikka et käytä sitä työssäsi. Se on kaunis, ja se muuttaa ajattelutapaa.

Haskell kuka?

Esittely ensin: mikä on Haskell? Haskell on laiska, puhtaasti toimiva ohjelmointikieli.

Mikä se nyt on?

No, laiska tarkoittaa, että Haskell ei suorita komentojasi heti, vaan odottaa kunnes tarvitset tuloksen. Aluksi tämä voi tuntua oudolta, mutta se sallii joitain melko hienoja ominaisuuksia - kuten äärettömiä luetteloita:

parilliset numerot = [0, 2 ..]

Tämä katkelma julistaa taulukon, joka sisältää kaikki parilliset numerot. Mutta kuten totesimme, Haskell on laiska, joten se ei laske mitään ennen kuin pakottaa tekemään niin.

ota 10 parillista numeroa

Koodi palauttaa evenNumeroiden 10 ensimmäistä elementtiä, joten Haskell laskee vain ne.

Bonus: kuten näette, kutsut Haskellissä toimintoa ilman suluja. Kirjoita vain funktion nimi ja sen jälkeen argumentit (kuten päätteessä, jos haluat).

Sanoimme myös, että Haskell on puhtaasti toimiva. Tämä tarkoittaa, että yleensä toiminnoilla ei ole sivuvaikutuksia. Ne ovat mustia laatikoita, jotka ottavat syötteen ja sylkevät tulosteen vaikuttamatta ohjelmaan millään muulla tavalla.

Bonus: Tämä tekee testaamisesta paljon helpompaa, koska sinulla ei ole salaperäistä tilaa, joka hajottaa toimintosi. Mikä tahansa toimintotarpeesi, hyväksytään argumenttina ja voidaan testata.

Matematiikka, rekursio ja Haskell syöttävät palkin

Lisäisin myös, että Haskell on todella kuin matematiikka. Selitän itseni esimerkillä: Fibonacci-sekvenssi.

Fibonacci-sekvenssi määriteltynä matematiikassa ja Haskellissä. Haskell-versiota ei ole optimoitu ollenkaan

Kuten näette, määritelmät ovat hyvin samankaltaisia. Liian samanlainen saatat sanoa.

Joten missä silmukat ovat?

Et tarvitse niitä! Nämä neljä riviä ovat kaikki mitä Haskell tarvitsee laskeakseen Fibonacci-sekvenssin. Se on melkein triviaalia. Se on rekursiivinen määritelmä, joka tarkoittaa, että funktio kutsuu itseään. Ymmärrettävyyden vuoksi tässä on esimerkki rekursiivisesta toiminnosta:

tekijä :: (integraali a) => a -> a
tekijä 0 = 1
factorial x = x * factorial (x-1)

Tässä on mitä tietokone tekee laskettaessa puhelutekijää 5:

tekijä 5 = 5 * tekijä 4
tekijä 4 = 4 * tekijä 3
tekijä 3 = 3 * tekijä 2
tekijä 2 = 2 * tekijä 1
tekijä 1 = 1 * tekijä 0
tekijä 0 = 1
tekijä 1 = 1 * 1 = 1
tekijä 2 = 2 * 1 = 2
tekijä 3 = 3 * 2 = 6
kerroin 4 = 4 * 6 = 24
kerroin 5 = 5 * 24 = 120

Saatat ajatella, että tämä lähestymistapa on tehoton, mutta se ei ole totta. Jollakin huolella voit saavuttaa C-kaltaisen nopeuden, joskus jopa hiukan paremmin (katso lisätietoja tästä pinoamisvirtalangasta).

Odota! Etkö sanonut mitään muuttujia?

Kyllä, Haskellillä ei ole muuttujia - vain vakioita. No OK, teoriassa Haskellillä on muuttujia. Mutta käytät niitä harvoin.

Miten tämä voi olla? Et voi koodata ilman muuttujia, se on pähkinää!

No, useimmat kielet ovat välttämättömiä. Tämä tarkoittaa, että suurin osa koodista selittää tietokoneelle, kuinka jokin tehtävä suoritetaan. Toisaalta Haskell on deklaratiivinen. Joten suurin osa koodista menee haluamasi tuloksen määrittelemiseen (vakiot ≈ määritelmät). Sitten kääntäjä selvittää, kuinka se tehdään.

Kuten jo havaitsimme, toiminnot Haskellissa ovat puhtaita. Ei ole tilaa muokata, eikä muuttujia tarvita. Välität tietoja eri toimintojen läpi ja haet lopputuloksen.

Tyyppijärjestelmä (ei, en aio käydä staattisessa ja dynaamisessa keskustelussa)

Opiskellessani Haskellin tyyppijärjestelmää, ensimmäinen leuan tiputin oli minulle algebrallinen tietotyyppi. Ensi silmäyksellä ne ovat vähän kuin enumeja.

data käsi = vasen | oikea

Määritimme juuri kädetietotyypin, jolla voi olla arvo Vasen tai Oikea. Katsotaanpa kuitenkin hieman monimutkaisempi esimerkki:

data BinTree = Tyhjä
          | Leaf Int
          | Solmu BinTree BinTree

Määrittelemme binaarisen puun rekursiivisella tyypillä. Tyyppimääritelmät voivat olla rekursiivisia!

Okei, saan sen: Haskell on mahtava

  • Mutta mistä voin oppia lisää? Henkilökohtainen ehdotukseni on hieno ilmainen kirja Opi sinulle Haskell for Great Good
  • Mutta haluan jotain, joka voi auttaa minua töissä! Monia Haskellin upeita ominaisuuksia voidaan käyttää myös JavaScriptissä (vaikkakin hieman monimutkaisemmalla syntaksilla ja lisäkirjastoilla). Lisätietoja on JS: n käytännön johdanto toiminnalliseen ohjelmointiin.