-- osnovni tipovi podataka
-- Integer 
-- Float
-- Bool: True, False
-- String: "Neki string"
-- Char: 'a'

-- u cistim funkcionalnim jezicima nema dodele, samim tim
-- nema ni promenljivih, a samim tim ni bocnih efekata

-- konstantna funkcija
{-- ovo je viselinijski
komentar -}
-- prototip funkcije pre "=" , i telo funkcije posle "="
c = 6

--unarna funkcija
inc x = x+1

{-- kompozicija funkcija
   prioritet je sa desna na levo, tako da zagradam
   redefinisemo taj prioritet u primeni funkcija
Main> inc inc 5
ERROR - Cannot infer instance
*** Instance   : Num (a -> a)
*** Expression : inc inc 5

Main> inc (inc 5)
7
Main> 
--}

-- binarna funkcija
addsqr x y = x*x+y*y

-- parcijalna primena funkcije
-- povratna vrednost binarne funkcije na koju je primenjen
-- samo 1 argument je unarna funkcija
{--
Main> addsqr 5 6
61
Main> addsqr 4
ERROR - Cannot find "show" function for:
*** Expression : addsqr 4
*** Of type    : Integer -> Integer

Main> (addsqr 4) 5
41
-}

-- poredjenje na nejednakost nije != vec /=
fakt n = if n==0 then 1 else n*(fakt (n-1))

deljivost n
	| mod n 3==0 = "Broj je deljiv sa 3"
	| (mod n 5)==0 = "Broj je deljiv sa 5"
	| otherwise = "Nesto drugo"
	
-- ovo where nije dodela vec nesto nalik #define direktivi 
-- u c-u
tipb n
	| b==0 = "Broj je oblika 3k"
	| b==1 = "Broj je oblika 3k+1"
	| otherwise = "Broj je oblika 3k+2"
	where b = (mod n 3)


