Aula 8

livro texto (cap 7)

Haskell online

compilado

Faltou em funções de alto nivel

f (g (h x)))

f $ g $ h x

(f . g . h) x

. é a composição de 2 funcoes

normalmente usado em map

map (f . g) lista

map (\x -> f (g x)) lista

tarefa 3

import Data.Char (toLower,isSpace)

soma1 [] x = [(x,1)]
soma1 ((ch,v):ls) x 
    | x==ch = (ch,v+1):ls
    | otherwise = (ch,v):(soma1 ls x)
    

letramaiscomum str = snd $ maximum $
  map (\ (a,b) -> (b,a)) $ foldl soma1 [] $
    filter (not . isSpace) $ map toLower str

Modulos

import Data.List  -- tudo !!!

import Data.List (nub,sort)  -- apenas

import qualified Data.List as DL -- qualificado

DL.sort

Data.List

De uma olhada em Data.List

Data.Map.Strict

dicionários (implementados como arvores binarias balanceadas, e tempo de acesso = O(log n)

Data.Map.Strict

import qualified Data.Map.Strict as Map

insertWith :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a

soma1 dic ch = Map.insertWith (+) ch 1 dic 

Data.char

https://www.haskell.org/hugs/pages/libraries/base/Data-Char.html

Exercicos (resposta)

data Tree a = Vazia | No a (Tree a) (Tree a) deriving (Eq,Show,Read)

removeabb :: Ord a => a -> Tree a -> Tree a

removeabb _ Vazia = Vazia
removeabb x (No y ae ad) 
    | x < y  = No y (removeabb x ae) ad
    | x > y  = No y ae (removeabb x ad)
    | x == y = aux1 x ae ad
    

aux1 x ae ad 
    | ae == Vazia = ad
    | otherwise = No novaraiz (removeabb novaraiz ae) ad
    | 
    where
        novaraiz = omaior ae
    
omaior (No x _ Vazia) = x
omaior (No _ _ ad) = omaior ad

essa é uma solução (deselegante).

a solucao é deselegante por razoes sintaticas (poderia tudo esta como funções auxiliares) mas principalmente porque vc tem que andar pela arvore a esquerda 2 vezes, para achar o maior e para remove-lo

podemos fazer isso de uma so vez

acha_remove_maior :: Ord a => Tree a -> (a,Tree a)

acha_remove_maior (No x ae Vazia) = (x,ae)
acha_remove_maior (No x ae ad) = (maior, No x ae nova_ad)
    where
        (maior,nova_ad) = acha_removemaior ad

agora aux1 fica

aux1 x ae ad 
    | ae == Vazia = ad
    | otherwise = No nova_raiz ae nova_ad
    where
        (nova_raiz,nova_ad) = acha_removemaior ad

melhor ainda é nao definir aux1 e simplesmente colocar a expressão no linha do x==y

solução final:

removeabb :: Ord a => a -> Tree a -> Tree a

removeabb _ Vazia = Vazia
removeabb x (No y ae ad) 
    | x < y  = No y (removeabb x ae) ad
    | x > y  = No y ae (removeabb x ad)
    | x == y && ae == Vazia = ad
    | otherwise =  No nova_raiz ae nova_ad
    where
        (nova_raiz,nova_ad) = acha_removemaior ad

I/O primeira parte

ainda sem ler ou imprimir

read "  8  " :: Int

read "  8  " :: Float 

show 9.876