Zašto (i kako) naučiti Haskell?

Razmišljanje o problemima je jedna od najbitnijih stvari koje se nauče uz Haskell — i još nekoliko saveta od vrhunskih programera.

Vukašin Stojkov - 10. Avgust, 2016.

Funkcionalno programiranje se u nemaloj meri razlikuje od “tradicionalnog”, odnosno imperativnog, u koju grupu između ostalog spadaju PHP, Ruby, Java i drugi.

Jedna od razlika u odnosu na ove poznate jezike je imutabilnost — jednom kada definišete vrednost promenljive ona je zauvek takva, što može izazvati blaži mindfuck na prvu loptu. Neke od prednosti ovakvog stila programiranja je lakše debagovanje, testiranje, te konciznost i, po nekima, bolja preglednost kôda.

Još jedna bitna razlika, je postojanje referencijalne transparentnosti [eng. referential transparency], a sažeto nam osnovnu distinkciju opisuje Mladen Srdić, Engineering Lead u Seven Bridgesu:

mladen

U jednoj rečenici: glavna razlika je u načinu razmišljanja o problemu i konstrukcije rešenja – u imperativnim jezicima se rešenje opisuje “ŠTA” koracima, dok se u funkcionalnim/deklarativnim jezicima opisuje “KAKO” koracima.

Funkcionalno programiranje nije nešto što je specifično samo za određene jezike (ML familija, Lisp familija), već je uveliko prihvaćeno kao mainstream u svetu.

Scala je verovatno “najglasnija” u tom svetu, ali je, po mom mišljenju, pomalo šizofren jezik. Uz Javu 8 je uvedeno dosta novih koncepata (stream interfejsi, paralelne kolekcije), a neki su poboljšani (lambde).

Sve to manje-više potiče iz sveta funkcionalnog programiranja, ali su veoma stare ideje, pa se ne može reći da je nešto novo i magično u pitanju. Još jedan lep primer je i F#, ali taj ekosistem se dosta brže razvijao, što se može lepo videti na primeru C# i evolucije istog.

Sad, zašto biste hteli da odvojite svoje dragoceno vreme da naučite npr. Haskell, čisti funkcionalni jezik?

Ovo smo pitali Mirana Lipovaču, autora najpopularnije knjige za učenje Haskella, Learn You a Haskell for Great Good.

miran 1

Mislim da bi najveće prednosti bile to što bi uz učenje i upotrebu ovog jezika programeri bili primorani da probleme posmatraju iz perspektive na koju nisu navikli u imperativnim jezicima (poput C-a, Jave ili Pythona).

Baš to drugačije razmišljanje o problemima je najvažnija stvar koju programeri pokupe uz Haskell, i to nam može biti veoma vredno dok radimo sa drugim jezicima, ali i kada rešavamo probleme izvan programiranja.

Blagosti i kletve Haskella

Ako govorimo o problemima Haskella, Mladen kaže da lenjost može biti mač sa dve oštrice:

mladen

Lenjost je jedna od lepših stvari, ali istovremeno može da bude i veoma teško za razmišljanje i debagovanje. Jezik radi tako i to može da uzrokuje probleme u toku dizajna programa i rada programa (space leak).

Uglavnom se svodi na to da je u početku veoma dobar i simpatičan feature jezika, onda ga iskoristiš za nešto i to radi, a onda se odjednom okrene protiv tebe i nemaš pojma šta se dešava.

Mladen ističe Haskellov type sistem kao izuzetnu karatkeristiku jezika:

mladen

Još jedna lepa karakteristika Haskella je njegov veoma moćni type sistem. Ovo je noćna mora za pisanje po internetu i uglavnom se startuje flame war oko toga, ali samo ću reći da tipovi dosta pomažu u razvoju velikih sistema. Opet, nisu panacea, ali neke stvari postaju zdravo-za-gotovo sa njima.

Kod Haskella je posebno lepo što ima statički type sistem koji nije striktan – to znači da su deklaracije tipova opcione – ali pošto su tipovi dodatna i najkorektnija dokumentacija koda, onda se često i koriste u Haskell kodu. Ovo, naravno, zavisi od stila samog programera i veličine i tipa problema.

Kako se približiti Haskellu?

Miran je list bosanske gore, a svoju knjigu je napisao u Ljubljani gde živi i radi. ‘Learn You a Haskell’ se do sada prodala u 15.000 primeraka i ima izuzetne ocene.

miran 1

Za veliku popularnost naslova je verovatno odgovorno to što Haskell predstavlja na veoma pristupačan način. Pokušavao sam da u njoj predvidim gde će ljudi imati najveće probleme i trudio sam se da te stvari lepo objasnim, i ponovim to gde ima smisla.

Kada sam je pisao nisam se još uvek dugo bavio Haskellom tako da sam se dobro sećao stvari koje su meni pravile problem tokom učenja.

Knjiga je dostupna i potpuno besplatno online.

Mladen, takođe, ima vredne savete za sve koji žele da uđu u Haskell:

mladen

Kao i za sve ostalo, upornost i metodičnost se isplate. Svako ima drugačiji stil učenja i ne postoji pravi koraci.

Tutorijala na Internetu ne manjka, broj knjiga je takodje dosta porastao u poslednjih par godina, a sam kolektiv profesionalaca i entuzijasta ima zdrav stav prema početnicima.

Moja preporuka bi bila Miranova knjiga. Iako ima par godina od kako se pojavila, i dalje je relevantna i pristupačna za početnike, a ostaviće vas taman na lepoj granici početnika i uplivavanja u svet praktičnog Haskella.

Izbor primarnog resursa je veoma bitan, jer je kriva učenja Haskella veoma strma i dosta ljudi se odvratilo od namere da prodube svoje znanje.

Moje mišljenje je da ništa ne može da zameni eksplorativno programiranje i pravljenje nečega opipljivog, i svakako predlažem takvu avanturu svima čim se osete dovoljno komotno sa osnovama jezika (ovo važi za bilo koju tehnologiju).