Akumulační funkce

foldl1 (-) [2,3,2] --> -3
foldr1 (-) [2,3,2] --> 1

foldl, foldr

foldl (-) 0 [2,3,2] --> -7
foldr (-) 0 [2,3,2] --> 1 (2-0, 3-2, 2-1)
foldr (:) [] "Coze?" --> "Coze?"
foldr (\x y->(x+1):y) [100] [1,2,3] --> [2,3,4,100]

Typové třídy

Typová třída Eq

class Eq a where
  (==), (/=) :: a -> a -> Bool
  x /= y = not (x == y)

Přidružení typů k typové třídě (deklarace instance)

instance Eq Bool where
  False == False = True
  True == True = True
  _ == _ = False
instance Eq Int where
  (==) = primEqInt -- Hardwarove implementace jak porovnavat Int
instance (Eq a, Eq b) => Eq (a,b) where
  (x,y) == (u,v) = x == u && y == v

Využití typové třídy jinou typovou třídou

Typová třída Ord využívající typovou třídu Eq

class (Eq a) => Ord a where
  (<=), (>=), (<), (>) :: a -> a -> Bool
  max, min :: a -> a -> a
  x >= y = y <= x
  x < y = x <= y && x /= y
  x > y = y < x
  max x y = if x >= y then x else y
  min x y = if x <= y then x else y

Přenos vlastností typu na složený typ

instance (Ord a) => Ord [a] where
  [] <= _ = True
  (_:_) <= [] = False
  (x:s) <= (y:t) = x < y || (x == y && s <= t)

Přetížení

Implicitní deklarace instance

data Nat = Zero | Succ Nat
  deriving (Eq, Show)

Časová složitost

Asymptotický růst funkcí

Časová složitost algoritmu

Časová složitost problému

A redukční strategie

Akumulátor

-- Exponenciální složitost
fib' :: Integer -> Integer
fib' 0 = 0
fib' 1 = 1
fib' n = fib' (n-2) + fib' (n-1)

-- Lineární složitost
fib :: Integer -> Integer
fib = f 0 1
    where f a _ 0 = a
          f a b k = f b (a+b) (k-1)