t :: Int
t = 42

s = 100 : [1,2,3]

f :: Int -> Int
f 0 = 1
f n = n * f (n - 1)

-- primer lokalne defincije
a :: Int
a = let x = 3 in x * x + 7

b :: Int
b = x * x + 7 where x = 3

c :: Int
c = f 10
    where
     f :: Int -> Int
     f 0 = 1
     f n = n * f (n - 1)

-- faktoriela na tri načine

fakt1 :: Int -> Int
fakt1 0 = 1
fakt1 n = n * fakt1 (n - 1)

fakt2 :: Int -> Int
fakt2 n = case n of               -- OCaml: match n with
            0 -> 1
            n -> n * fakt2 (n - 1)

fakt3 :: Integer -> Integer
fakt3 n = case n of { 0 -> 1 ; n -> n * fakt3 (n - 1) }

fakt4 :: Integer -> Integer
fakt4 n = if n == 0 then 1 else n * fakt4 (n - 1)

--- tipi

-- okrajšava ali sinonim
type Height = Integer

h :: Height
h = 42

--- seznami na roko

-- OCaml:
--    type 'a list = Nil | Cons of 'a * 'a list

data List a = Nil | Cons (a, List a)
  deriving Show


-- seznam 1, 4
mojSeznam = Cons (1, Cons (4, Nil))

-- Konstruktorji so lahko "curried"
data Seznam a =
   Prazen
 | Stik a (Seznam a)


-- seznam 1 4
tvojSeznam = Stik 1 (Stik 4 Prazen)
