(URGENTE) Haskell exercicio

boas pessoal, alguem m consegue resolver este exercicio sff!?!?!? Usando apenas funçoes d ordem superior, map foldr e filter!


type Equipa = [Char]
type Golos = Int
type Pontuacao = ([Char], Int)
type Campeonato = [Pontuacao]
type Jogo = (Equipa, Golos, Equipa, Golos)

liga = [ ("Boavista", 5), ("Porto", 18), ("Benfica", 12), ("Sporting", 10), ("Braga", 8)]

1) Dado um campeonato, retorna o nome da equipa (só o nome da equipa) que vai em último lugar.

2) No ambito do apito dourado foi decidido retirar 1 ponto a todos os clubes.
Dado um campeonato, devolva um campeonato com menos 1 ponto em cada clube.

3) Devolva a lista de equipas com mais de 10 pontos.

4) Some todos os pontos do campeonato.
Escreva duas funções com o mesmo resultado.

4.1) Utilizando obrigatoriamente a função 'unzip'
4.2) Sem a função 'unzip'.

5) Dado um campeonato e a informação de um jogo, retorne um novo campeonato com a pontuação actualizada, utilizando 3 pontos para a equipa que vence, e 1 ponto para as duas equipas, caso empatem.
 
Última edição:
Se disseres quais são as dúvidas que tens é mais fácil ajudar...

As duvidas estao em resolver o exercicio todo!!!
N consigo por nenhum a correr no ghc!!!
Ja vou colar o k fiz ate agora!

Module teste where

type Equipa = [Char]
type Golos = Int
type Pontuacao = ([Char], Int)
type Campeonato = [Pontuacao]
type Jogo = (Equipa, Golos, Equipa, Golos)


PERGUNTA 1


liga = [("Boavista", 5), ("Porto", 18), ("Benfica", 12), ("Sporting", 10), ("Braga", 8)]

retiraponto :: Campeonato -> Campeonato
retiraponto [] = []
retiraponto l x= map (\(a,b)->(a,(tira x b) 1
where tira y 1


PERGUNTA 2

maisdedez :: Pontuação -> Equipa
maisdedez [] = []
maisdedez l y = filter (\(a,b)-> b >= y) 10


Sabes de algum erro aqui? Obg.
 
Última edição pelo moderador:
estive a ver as tuas funções

na pergunta 2 a "Tira 1 Ponto"
não era mais fácil fazer
Código:
tira :: Campeonato -> Campeonato
tira x = map (\(a,b)->(a,b-1)) x
na pergunta 3 a "Mais de 10 Pontos"
Código:
mais :: Campeonato -> Campeonato
mais x = filter (\(a,b)->b>=10) x
pelo que fizeste dá para ver que não percebeste bem o conceito de ordem superior,
se fosse a ti revia os apontamentos sobre isso antes de tentar fazer mais alguma coisa :P

alguma duvida é so perguntar, já te fiz duas para veres como é fácil as outras são do mesmo genero ( uma «cagada» ) mas para as fazeres tens de primeiro perceber o que é uma função de ordem superior e o que ela faz, neste caso elas vão tratar da recursividade por ti e mais "bla bla" que de certeza que esta nos apontamentos
 
estive a ver as tuas funções

na pergunta 2 a "Tira 1 Ponto"
não era mais fácil fazer
Código:
tira :: Campeonato -> Campeonato
tira x = map (\(a,b)->(a,b-1)) x
na pergunta 3 a "Mais de 10 Pontos"
Código:
mais :: Campeonato -> Campeonato
mais x = filter (\(a,b)->b>=10) x
pelo que fizeste dá para ver que não percebeste bem o conceito de ordem superior,
se fosse a ti revia os apontamentos sobre isso antes de tentar fazer mais alguma coisa :P

alguma duvida é so perguntar, já te fiz duas para veres como é fácil as outras são do mesmo genero ( uma «cagada» ) mas para as fazeres tens de primeiro perceber o que é uma função de ordem superior e o que ela faz, neste caso elas vão tratar da recursividade por ti e mais "bla bla" que de certeza que esta nos apontamentos


Lol obrigado pela ajuda... foi pena ter vindo 1 pouco tarde... tive d entregar o exercicio a 13:30... thanks anyway
Vou ter d ver melhor esta cena do haskell, mas n gosto nd disto... mt complicado e o GHC atrofia com um espaço a + ou uma virgula fora do sitio...
Os apontamentos, tb podiam tar + simples, dd recursividad ate funçoes d ordem superior, é fdd d entender!!!
 
o Haskell é um bocado 'mariquinhas' nessas coisas dos alinhamentos...
quanto ao tempo de resposta nada a fazer, tenta perguntar com mais tempo

apontamentos... no meu tempo queixava-me do mesmo...

as funções de ordem superior são funções que recebem funções como argumento
por exemplo a função map recebe como argumentos uma função para aplicar a cada elemento da lista e a lista
outra coisa que deves ter em mente é que as funções map foldr e filter alem de serem de ordem superior também são funções que implementam elas próprias os padrões de recursividade das listas em Haskell

a map e a filter poderiam ser definidas como
Código:
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (h:t) = (f h) : (map f t)

filter :: (a->Bool) -> [a] -> [a]
filter _ [] = []
filter f (h:t) = if (f h) then h:(filter f t) else (filter f t)
nao sei se o prof deu a solução, mas uma possível solução para o exercício seria

Código:
--- 1 ---
ultimo :: Campeonato -> Equipa
-- ultimo [] = error "nao ha equipas"
ultimo (h:t) = fst(foldr f h t)
 where
  f :: Pontuacao -> Pontuacao -> Pontuacao
  f (a,b) (c,d) = if b<d 
                   then (a,b)
                   else (c,d)

--- 2 ---
tira :: Campeonato -> Campeonato
tira = map (\(a,b)->(a,b-1))

--- 3 ---
maisD10 :: Campeonato -> Campeonato
maisD10 = filter ((10<).snd)

--- 4 ---
--4.1
somaV1 :: Campeonato -> Int
somaV1 = (foldr (+) 0).snd.unzip

--4.2
somaV2 :: Campeonato -> Int
somaV2 = foldr ((+).snd) 0

--- 5 ---
actualiza :: Campeonato -> Jogo -> Campeonato
actualiza x y = map (f y) x
 where
  f :: Jogo -> Pontuacao -> Pontuacao
  f (ec,gec,ea,gea) (e,p) | (gec == gea) && (e == ec || e == ea) = (e,p+1)
                          | (gec >  gea) && (e == ec)            = (e,p+3)
                          | (gea >  gec) && (e == ea)            = (e,p+3)
                          | otherwise                            = (e,p)
 
Última edição pelo moderador:
Back
Topo