You are on page 1of 41

Haskell - programski jezik budućnosti?

Kristijan Šarić, EXACT BYTE


Uvod

Kristijan Šarić, EXACT BYTE


Moje iskustvo
● Oracle PL/SQL, Oracle Forms/Reports
● Java (desktop, web, mobilne) aplikacije
● Python (ML, web aplikacije, skripte)
● JavaScript (Angular, React, …)
● Scala (web), čisto funkcijsko programiranje
● Haskell (IOHK - explorer, wallet, cardano-shell, consulting za strane kompanije)
○ Vlastiti proizvodi
■ https://www.emprovio.com/
■ https://www.pestflop.com/
■ https://www.contetino.com/
■ https://alenn.ai
■ …
● Lokalno? Druga priča.
Programiranje “izvana”
● Davanje instrukcija mašini koja te instrukcija obrađuje
● Formalizacija korisničkih zahtjeva u jako precizan (matematički?) jezik
○ “Treba mi mobilna aplikacija koja može naplatiti račun” -> 20 000 linija koda preciznih instrukcija, mjeseci
posla
■ Kakav račun? Aha, sada moram učitati podatke od negdje.
■ Što znači naplatiti? Aha, više načina plaćanja.
■ Kakva mobilna aplikacija? Aha, još web aplikacija koja komunicira sa to mobilnom aplikacijom.
● Tipični komentari:
○ “Prosto ko pasulj”
○ “Šta toliko kompliciraš?”
○ “Svi vi informatičari ste isti”
○ “Pa to je dva sata posla”
● Svi programeri su isti.
Programiranje “iznutra”
● “Ma neka korisnici testiraju”
● “Pokrenulo se, radi”
● “Ma neće to korisnik stisnuti”
● “To je lako, treba mi 15 minuta da to dodam”
● Svi programeri nisu isti, postoje ogromne razlike
● U “stvarnom svijetu”:
○ Mars Climate Orbiter, 125 miljuna dolara
○ Ariane 5 let 501, 8 miljardi dolara
○ EDS, 1 miljardu funti
○ Therac-25 Medical Accelerator, 5 mrtvih, više jako ozlijeđeni
○ NASA
● Kako je Boing testirao sustav svojih aviona? Netko čuo za tu priču?
Cijena izmjene
Kako ne napraviti grešku
● Jednostavno, da jednostavnije ne može biti, prejednostavno ne postoji
● Provjerena rješenja, ne najnoviji library
● Sve testiraj, programski testovi
● Koristi ono što radi, ne koristi ono što ne radi ili ono što ne znaš/rzumiješ
● Napravi glupi popravak koji razumiješ, napravi bolje kada više razumiješ i kada imaš više vremena
● Jednostavno?

Zašto?

Kompleksno/Komplicirano.

https://en.wikipedia.org/wiki/Rube_Goldberg_machine
Programiranje je teško?

1. DA?
2. NE?
Koliko početniku treba da razumije 5 linija koda?
Koliko stručnjaku treba da razumije 5 linija koda?

Koliko vama treba da razumijete 5 linija koda?


Zadatak za vas (kopiran od Dierk König)
● 5 linija koda, to valjda znate u par sekundi, ne?
● Pitanje je - “što ovaj program radi?”
● Dignite ruku kada znate odgovor
● Držite dignutu ruku kada znate odgovor
● Kada pola prostorije digne ruke prozvati ću nekoga tko je dignuo ruku neka kaže riješenje
● Nemojte dobacivati odgovore!
Zadatak
A = 1;

B = 2;

C = B;

B = A;

A = C;
Zadatak
Zamijenio je dva broja.

Di je tu problem?

Koliko ste rekli da vam treba vremena?

Zašto je programiranje ovako teško?


Ograničenje naših umova
● 7 +/- 2 informacije
● Moramo paziti koje vrijednosti su gdje i u kojem trenutku u vremenu
● Računalo lako može držati u memoriji tisuće informacije, mi ne možemo
Zadatak
● Jedna linija koda
● Dignite ruku kada znate riješenje
Zadatak

swap (a, b) = (b, a)


Imperativni i deklarativni jezici
● Što vs Kako?
● What /= How
● Visoki nivo/niski nivo
● Vrijeme programera/Vrijeme CPU-a
Zadatak
Zadatak

randomA a = Random.int() * a
Čiste funkcije
● “Prave” (matematičke) funkcije
● Funkcije koje ne mogu mijenjati vrijednosti
● Za iste vrijednosti koje pošaljemo uvijek dobijemo istu vrijednost nazad
● Kako išta korisno onda možemo raditi?
● Ne možete mjenjati stanje programa i komunicirati sa “svijetom”, osim ako funkciju tako ne
“označite” (tada su “nečiste”)
● Kompozicija?

Kako se to piše u Haskellu?


Haskell
λ> let swap (a, b) = (b, a)

λ> swap (3, 5)

(5,3)
Haskell
λ> :t swap

swap :: (b, a) -> (a, b)

λ> :t swap (3 ,5)

swap (3 ,5) :: (Num b, Num a) => (a, b)


Haskell IO
IO? Input Output.

Koji je prvi program koji se uvijek piše u svim programskim jezicima?


Haskell IO
λ> putStrLn "Hello world"

Hello world

λ> :t putStrLn "Hello world"

putStrLn "Hello world" :: IO ()


Haskell IO
● Na ovoj prezentaciji/predavanju/štogod-ovo-je ne koristimo komplicirane izraze koji počinju na M
● I završavaju na onad
● IO je oznaka da funkcija radi IO operacije
● IO operacije znači da ih može raditi više?
● DA.
Haskell IO
λ> let writeDownStuff = do putStrLn "Hello"; putStrLn "World";

λ> :t writeDownStuff

writeDownStuff :: ??
Haskell IO
λ> let writeDownStuff = do putStrLn "Hello"; putStrLn "World";

λ> :t writeDownStuff

writeDownStuff :: IO ()

λ> let writeDownStuff = do

putStrLn "Hello"

putStrLn "World"
Haskell idealni razvoj
functional-core-imperative-shell

IO

Čiste funkcije
Korisnost odvajanja operacije “efekata” (IO)
● STM? Software Transactional Memory
● Način izrade konkurentnih (kažimo jednostavnije paralelnih) programa
● Retry logika (IF postoji promjena u vezanoj varijabli THEN RETRY;)
● Koji problemi mogu ovdje nastati? (Računi Marko i Ana)

1000

Marko
AKKO Ana

100
Parametri, Curry-ing
λ> :t fst

fst :: (a, b) -> a

λ> :t (+1)

(+1) :: Num a => a -> a

λ> :t (\number -> number + 1)

(\number -> number + 1) :: Num a => a -> a


Parametri, Curry-ing
λ> let nonAnonFunction number1 number2 = number1 + number2 + 1

λ> :t nonAnonFunction

nonAnonFunction :: Num a => a -> a -> a

λ> :t (\number1 number2 -> number1 + number2 + 1)

(\number1 number2 -> number1 + number2 + 1) :: Num a => a -> (a -> a)

λ> :t (\number1 number2 -> number1 + number2 + 1) 3

(\number1 number2 -> number1 + number2 + 1) 3 :: Num a => a -> a


Kompozicija

A C
Kompozicija
λ> :t swap

swap :: (b, a) -> (a, b)

λ> :t fst . swap

fst . swap :: (b, c) -> c

λ> :t (+1) . fst . swap

(+1) . fst . swap :: Num b1 => (b2, b1) -> b1

Rezultat?
Kompozicija
λ> ((+1) . fst . swap) (3,5)

λ> (+1) . fst . swap $ (3,5)

λ> :t (.)

(.) :: Category cat => cat b c -> cat a b -> cat a c


Kompozicija
λ> :t (.)

(.) :: (b -> c) -> (a -> b) -> a -> c

A C
Kompozicija drugih funkcija
● Razmislimo malo
● Kompozicija funkcija sa IO operacijama?
● Baza?
● Primjer u “stvarnosti”?
IO

Čiste funkcije
Podatkovne strukture
λ> data TestList a = TestListHead | TestHead a (TestList a)

λ> :t TestList

TestList :: a ->TestList a

λ> :info []

data [] a = [] | a : [a]

λ> :i String
Podatkovne strukture
λ> :i String

type String = [Char]


Typeclass
● Interface
● Kada imaš čekić, ...

λ> :i Num
class Num a where
(+) :: a -> a -> a
(-) :: a -> a -> a
(*) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
Type-level programiranje
● Compiler provjerava umjesto vas
● Nemojte koristiti type-level programiranje osim ako točno znate što radite
● Velika sigurnost
● Velika muka za čitanje (još uvijek)
● Kada imaš čekić, ...
Extenzije
● Svaka extenzija u Haskell-u je drugi programski jezik
● Ima puno extenzija
● Radi se na extenzijama za dependent types (ili nečemu što tamo vodi)
● Puno ekstenzija rad je istraživača koji na jednu ekstenziju potroše godine (istraživači su često
doktori jako teških škola)
Lens
Postoje i library koji toliko promjene sintaksu da se čini da pišete drugi programski jezik. Matematičari su
krivi. Mora netko biti.

http://hackage.haskell.org/package/lens

λ> view _1 ("goal", "chaff")

"goal"

allVersions :: Traversal' ByteString Int

allVersions = _JSON . _Array . traverse . _Object . ix "version" . _1


Zaključak
● Preciznost ima cijenu
● Cijenu ima i točnost programa
● Haskell ima veliku preciznost, ali je zato i dosta težak jezik
● “With great power comes great responsibility”
● Postoje jezici puno precizniji i od Haskell-a (koje vam mogu pokazati ako postoji interes nakon što
par drugih ljudi prezentira nešto svoje)
● Budite ljudi, prezentirajte nešto što je vama interesantno
● Usput, što se tiče lokalnog razvoja, gledao samo uokolo, sastanak IT strukovne grupe je u utorak,
5.3. Pozivam vas da se pridružite.

You might also like