Predgovor

Ova knjiga je nastala sasvim neplanirano. Prvobitno sam napisao par stranica o Haskelu za potrebe predmeta Programske paradigme za učenike Zemunske gimnazije. Ti prvobitni podsetnici su neprestano dopunjavani, tako da su prerasli u skriptu od nekoliko desetina strana dostupnu na GitHub-u, a zatim i u digitalnu knjigu na posebnom domenu, knjigu koju trenutno čitate. Kako se obim teksta širio, širila se i ciljna publika, tako da sada ova knjiga može poslužiti ne samo gimnazijalcima, već i studentima koji na nekim od kurseva izučavaju programski jezik Haskel, ali i svima onima koji su zainteresovani za funkcionalno programiranje.

Knjiga je napisana za totalne početnike u funkcionalnom programiranju i od čitaoca se ne očekuje da poseduje bilo kakvo znanje o funkcionalnom programiranju. Ipak, podrazumeva se određena računarska pismenost (npr. poznavanje osnove rada u terminalu ili poznavanje osnova računarske arhitekture). Neophodno računarsko znanje je malo, i lako se može nadoknaditi istovremeno sa čitanjem knjige (npr. uz pomoć materijala dostupnih na internetu ili uz pomoć nastavnika ili prijatelja). Takođe, na nekim mestima u knjizi neophodno je znanje matematike (na nivou gimnazije) - ovakvi "matematički" delovi knjige se mogu preskočiti ako nisu interesantni čitaocu. Poznavanje drugog programskog jezika nije potrebno, ali je veoma korisno jer se u knjizi često ističu sličnosti i razlike između Haskela i nekog od "popularnijih" jezika poput C-a, Jave, Python-a, itd.

Ako bi se literatura o Haskelu mogla podeliti na osnovni, srednji i napredni nivo, onda bi ova knjiga pokrivala osnovni i deo srednjeg nivoa. Postoji mnogo Haskel knjiga koje pokrivaju sličan opseg, ali su načini izlaganja značajno različiti. Prilikom pisanja ove knjige, trudio sam se da svaki koncept objasnim detaljno (koliko je potrebno) pre prelaženja na sledeći koncept. Takođe, teme su izlagane redosledom koji je omogućio da se nijedno objašnjenje ne odlaže za kasnije (uz par izuzetaka). Na ovaj način, čitalac ima potpuno razumevanje svega što mu se na određenom mestu izlaže. Ovakav pristup zahteva nešto veće strpljenje od čitaoca, ali daje potpuniju sliku o Haskelu. Sama knjiga je podeljena na celine koje se nazivaju lekcije i u kojima se obrađuje po jedna tema.

Iako je Haskel jezik originalno zamišljen kao jezik za nastavu i istraživanja, Haskel je odavno prevazišao akademske namene i danas se uspešno koristi u industriji za realizaciju najrazličitijih projekata (kompajleri, web serveri, finansijski softver, desktop okruženja i desktop aplikacije, igrice, itd...) Ipak, broj Haskel projekata u industriji je i dalje neuporedivo manji od broja projekata koji su realizovani kroz bilo koji od gore spomenutih jezika. Stoga, postavlja se pitanje, vredi li učiti Haskel? Moj odgovor (kao i odgovor mnogih, rekao bi i svih, koji su savladali Haskel), je potvrdan. Haskel jezik, fundamentalno različit od proceduralnih i objektno orijentisanih jezika koji danas dominiraju, zahteva od nas da iz korena promenimo način na koji razmišljamo o programiranju. Ovakva promena tačke gledišta, iako prvobitno teška, daje nam širu sliku o programiranju i uči nas mnogim idejama koje možemo kasnije primeniti u drugim jezicima. Mnoge napredne konstrukcije u drugim jezicima imaju pandan u Haskelu koji je sasvim jednostavan i elegantan. Savladavanjem Haskela gotovo uvek savlađujemo i druge jezike.

Uzimajući u obzir rečeno, tokom pisanja ove knjige trudio sam se da dam što više konkretnih primera, i da pravim poređenja sa drugim jezicima. Duži primeri su numerisani i izdvojeni u posebne celine da ne bi remetili glavni tok lekcije. Pored primera, u knjizi su izdvojeni i numerisani zadaci. Neki od zadataka poseduju rešenja: rešenja takvih zadataka mogu se prikazati (i sakriti) pritiskom na trougao koji se nalazi levo od oznake zadatka. Neki zadaci su trivijalni, dok ima i zadataka koji predstavljaju prave male projekte. Ako bih čitaocu mogao da dam jedan jedini savet, to je da što više zadataka reši koliko god neki zadaci delovali teško ili lako. Programiranje se ne može savladati prostim čitanjem knjige, već je neophodna upotreba naučenog.

U kodu koji je dat u knjizi, skoro uvek se vrednosti i funkcije imenuju na srpskom jeziku (sve sa dijakriticima). Iako smatram da je ovo loša praksa za projekte (bez obzira da li su lični ili profesionalni), isto smatram da ovakvo imenovanje može pomoći početniku da lakše uoči koja imena su sistemska a koja je definisao korisnik.

Za kraj, naveo bih literaturu o Haskelu koja je korišćena pri izradi ove knjige kao i resurse koji mogu koristiti čitaocu za naredna istraživanja.

  1. Learn You a Haskell for Great Good!, Miran Lipovaca - besplatno dostupna, i verovatno najpoznatija knjiga o Haskelu. Neozbiljan, humoristički pristup čini je privlačnom za mnoge početnike (ali i predmetom mnogih kritika).
  2. Haskell Programming from First Principles, Julie Moronuki, Chris Allen - opširna knjiga koja koja postepeno uvodi početnike u funkcionalno programiranje i detaljno opisuje Haskel jezik. Knjiga koju trenutno čitate, verovatno je najsličnija ovoj knjizi i pokriva nešto više od polovine tema obrađenih u Haskell Programming from First Principles.
  3. Haskell in Depth, Vitaly Bragilevsky - predstavlja uvod u naprednije teme Haskel programiranja - rad na realnim projektima (web aplikacije) i korišćenje poznatih biblioteka.
  4. Functional Design and Architecture, Alexander Granin - knjiga koja se bavi arhitekturom Haskel programa.

Postoje mnoge kvalitetne knjige o Haskelu koje nisu više pogodne za učenje jer je značajan deo biblioteka koje se koriste u njima promenjen. To se posebno odnosi na knjige koje su fokusirane na rešavanje praktičnih problema poput poznate i besplatno dostupne knjige Real World Haskell (Bryan O'Sullivan, Don Stewart, John Goerzen).

Osim knjiga postoje i mnogi drugi kvalitetni izvori informacija o Haskelu, kao što je The Haskell Unfolder serijal, The Haskell Interlude podkast, i Haskellweekly nedeljni pregled.