Funcao [Haskell]

nram

Power Member
Eu tenho uma lista de (nomes|Numeros) , e na função tenho que retirar da lista os nomes com o numero menor... se houver 2 numeros menores iguais, apagar os 2 nomes... comecei por fazer isto..

Código:
type Nome = String
type Numero = Int
type Jogadore = (Nome,Numero)
type Jogador = [Jogadore]

remMenor :: Jogador -> Jogador
remMenor [] = [] 
remMenor [(a,b)] = []
remMenor ((a,b):xs) = if (verMenor ((a,b):xs) == b) then remMenor xs else ((a,b):(remMenor xs))

verMenor :: Concerto -> Int
verMenor [] = []
verMenor ((a,b):xs) | (b < snd (verMenor xs)) = b 
                         | otherwise = verMenorDur xs
mas não dá.. de certeza... preciso que a função de verificar o mais pequeno fique numa variável para não fazer sempre essa função.

Cumprimentos
 
Última edição:
Tu tens isto:

Código:
type Nome = String
Type Numero = Int
type Jogador = (Nome,Numero)
Isto não é uma lista, é um par de elementos.

independentemente disso... não é isso o que me está a dar mal... eu quero uma função que chame outra apenas uma vez para saber o menor número da lista, e vou precisar da recursiva de uma para montar a lista.. mas não sei fazer / ou não me lembro... :X
 
Código:
remMenor :: Jogador -> Jogador
remMenor [] = []
remMenor [_] = []
remMenor ((a,b):(c,d):xs) | b<d = (c,d):(remMenor ((a,b):xs))
              | otherwise = (a,b):(remMenor ((c,d):xs))

Basta ir comparando 2 a 2. O menor vai ficando na lista inicial, enquanto que os outros passam para a a lista resultante.
 
mas imagina que aparece a seguinte lista:

[("nome1",7),("nome2",6),("nome3",9),("nome4",6)]

Ele só vai remover um deles ( ou o nome2 ou nome4)... por esse método!
 
Última edição:
A solução que encontrei passa por ordenar de acordo com o 2º elemento do par de cada elemento, essa tua lista de jogadores. Depois basta-me eliminar dessa lista todos aqueles cujo 2º elemento é o menor. Basicamente, aquilo que fiz foi:

l1 = [("andre",3),("Miguel",9),("joao",3)] :: Jogador

Passa para:

l1 = [("joao",3),("andre",3),("Miguel",9)] :: Jogador

E por fim:

l1 = [("Miguel",9)] :: Jogador

Código:
remMenor' l = let x = snd $ head $ isort l
           in filter (\y -> snd y /= x) l

isort [] = []
isort (h:t) = insere h (isort t)

insere x [] = [x]
insere x (y:ys) | snd x <= snd y = x:y:ys
        | otherwise = y:(insere x ys)

A função isort representa o algoritmo de insertion sort, adaptado a uma lista de pares (mais concretamente, a função insere é que está adaptada).
 
Back
Topo