Aula 7

livro texto (cap 6)

Haskell online outro - so compilado

1 $

f (g (h x y)) 

f $ g $ h x y

2 Composição .


( f . g ) x = f (g x)

aplica2 f = f . f

usado principalmente em map e fold, para criar uma função nova

3 Exemplos

  • conta o numero de vezes um item aparece numa lista
conta it l = foldl (\ac x -> if x==it then ac+1 else ac) 0 l

conta it l = foldr (\x res -> if x==it then res+1 else res) 0 l 
  • conta quantos elementos satisfazem uma função
contafunc f l = foldl (\ac x -> if f x then ac+1 else ac) 0 l
  • troca elemento velho por novo
troca velho novo l = foldr (\x res -> if x==velho then novo:res else x:res) [] l 

trocal velho novo l = foldl (\ac x -> if x==velho then acc++[novo] else acc++[x]) [] l

se voce esta construindo uma lista é preferível usar o FOLDR

  • remove elemento de uma lista
rem it l = foldr (\x res -> if it==x then res else x:res) [] l
  • remove elemento de uma lista (primeiras n vezes)
remn it n l = fst $ foldl (\(li,nn) x -> 
                     if x == it && nn > 0 
                         then (li,nn-1) 
                         else (li++[x],nn))
                   ([],n) l 

remn it 0 l = l
remn it n (x:xs)
   | x == it = remn it (n-1) xs 
   | otherwise = x: remn it n xs 


  • lista de posições de um item numa lista
posicoes it l = foldl (\(acc,n) x -> 
                         if x==it then (acc++[x], n+1) else (acc,n+1)) 
                      ([],0) l 
  • inserelista
-- versao fom foldl
inserelista l = foldl insereArvore Vazia l

insereArvore Vazia x = No x Vazia Vazia
insereArvore (No n ae ad) x 
   | x == n = (No n ae ad)
   | x < n  = (No n (insereArvore ae x) ad)
   | x > n  = (No n ae (insereArvoce ad x))


-- versao com foldr
inserelistar l = foldr (flip  insereArvore) Vazia l 

  • reimplemente os exercicios da aula 1 usando as funcoes de alto nivel

(map, filter, fold)

  • uma matrix é implementada como uma lista de linhas (que são listas)
1  2  3
4  5  6 
7  8  9
0  0 -1

[[1,2,3],[4,5,6],[7,8,9],[0,0,-1]]

implemente transposta que transpoe uma matrix

transp ([]:_) = []
transp mat = col1 : (transp restmat)
   where col1 = map head mat
         restmat = map tail mat
  • implemente matmul que dado duas matrizes de formatos apropriados multiplica-as. (*)
matmul m1 m2 = matmul' m1 (transp m2)

matmul' [] _ = []
matmul' (lin:r) m2 = (map (\l -> dotprod l lin) m2) : (matmul' r m2)

dotprod l1 l2 = sum $ zipWith (*) l1 l2