Jump to content
fearz7

Listas

Recommended Posts

fearz7

Pessoal penso que a minha duvida nao seja dificil. Ora bem gostaria de inserir um elemento numa lista mas na posição que eu desejar.

Ex:

let = (("lisboa",8,6.0),("braga",8,6.0),("setubal",8,6.0)("Algarve",8,6.0))

instrucao ("Porto",8,6.0) 2 -- o 2 corresponde à posicao onde quero inserir o novo elemento

resultado =  (("lisboa",8,6.0),("braga",8,6.0),("Porto",8,6.0),("setubal",8,6.0),("Algarve",8,6.0)) -- a lista inicializa em 0

E a outra duvida consiste em como remover um elemento da lista baseando-me na posicao deste.

let = (("lisboa",8,6.0),("braga",8,6.0),("setubal",8,6.0)("Algarve",8,6.0))

remover  ("braga",8,6.0) ou entao remover 1 -- onde 1 e a posicao que o elemento se encontra

resltado : (("lisboa",8,6.0),("setubal",8,6.0)("Algarve",8,6.0))

Share this post


Link to post
Share on other sites
pwseo

fearz7,

Primeiro, deixa-me dizer-te que a notação que estás a utilizar é para tuplos e não para listas. Nas listas utilizam-se parêntesis rectos. Além disso, não utilizas let sem dar um nome à expressão que se segue (e o let só utilizas dentro do ghci ou de monads).

Assim:

lista = [("lisboa", 8, 6.0), ("braga", 8, 6.0)]

Respondendo à tua pergunta, podes pensar na operação de inserir um elemento como sendo algo deste género:

inserir x na posição 2 é o mesmo que pegar nos 2 elementos iniciais da lista original, adicionar-lhe x, e depois colocar a lista original sem os dois elementos iniciais.

Funções que deves investigar: take e drop, ou então splitAt.

Link potencialmente interessante: How to work on lists

A função remover pode ser feita de forma semelhante.

Share this post


Link to post
Share on other sites
fearz7

Antes de mais obrigada pela ajuda que me deste seguindo o te conselho implementei a seguinte função:

inserir lista [(a,b,c)] pos = take pos lista ++ [(a,b,c)] ++ drop pos lista

Funciona correctamente mas diz o que achas.

Share this post


Link to post
Share on other sites
pwseo

Sim, funciona, mas podes simplificar.

-- Como tu tens, tens que aplicar a função assim
inserir lista [("Guimarães", 8, 6.0)] 2

-- O ideal seria não precisar dos parêntesis rectos.
-- l: a lista
-- e: elemento a inserir
-- p: posição
inserir' l e p = take p l ++ e : drop p l

-- Assim já podes usar desta forma:
gmr = ("Guimarães", 8, 6.0)
inserir' lista gmr 2

Share this post


Link to post
Share on other sites
Betovsky

Antes de mais obrigada pela ajuda que me deste seguindo o te conselho implementei a seguinte função:

inserir lista [(a,b,c)] pos = take pos lista ++ [(a,b,c)] ++ drop pos lista

Funciona correctamente mas diz o que achas.

Imagino que estejas no inicio a aprender Haskell. E para isso essa definição está bem e serve o propósito.

Mas depois no futuro, terás de ter em conta a performance e existe outras formas de isso ser bem mais eficiente. Usar take e drop na mesma chamada é logo motivo para soar o alarme ;)


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
fearz7

Esta função e para me ajudar num trabalho pratico e realmente um objectivo deste trabalho e a eficiência deste , se houver uma melhor forma de implementar esta função digam me desde que eu saiba explica lá bem o prof aceita , agora e certo que tou a tentar resolve lo com aquilo que aprendi e que me sinto mais a vontade ainda e o inicio , o splitat tem melhor eficiência?

Share this post


Link to post
Share on other sites
fearz7

Também já pensei em algo deste género Código:

insert_list xs e 0 = e:xs
insert_list (x:xs) e n = x:(insert_list xs e (n-1))

remove_list (x:xs) e 0 = xs
remove_list (x:xs) e n = x:(remove_list xs e (n-1))

Não sei se a syntax esta correcta

Cumprimentos

Share this post


Link to post
Share on other sites
Betovsky

Começa assim, conheces a função map? Como é que farias a função map?


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
fearz7

Nao, nao conheco. se quiseresmostrar como ficaria com a funcao map agradecia te ou dar as instrucoes

Share this post


Link to post
Share on other sites
fearz7

Ora bem , cheguei a esta definição

map f (x:xs) = f x : map f xs

estou no caminho certo?

Share this post


Link to post
Share on other sites
Baderous

Não sei se reparaste no link que deixei, mas do lado direito tem lá um link "Source" onde mostra o código fonte da função map:

map :: (a -> b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs

Share this post


Link to post
Share on other sites
fearz7

Nao percebo como esta função se aplica ao meu caso sinceramente , como e que esta funcao vai inserir um elemento dentro de uma lista na posição a escolha do utilizador.

let  lista = [("faro", 7 , 6), ("braga", 8 , 5), ("lisboa", 9 , 7), ("porto", 10 , 1) ]

-----------------------------------------------

-- faco uso da funcao map --

map' :: (a -> :P -> [a] ->

map' _ []    = []

map' f (x:xs) = f x : map f xs

----------------------------------------------

resultado :    [("faro", 7 , 6), ("braga", 8 , 5), ( "coimbra", 4 ,4), ("lisboa", 9 , 7), ("porto", 10 , 1) ]

como e que faço isso com a função map qual a instruçãio que tenho de por , nao percebo

Share this post


Link to post
Share on other sites
Betovsky

Ora bem , cheguei a esta definição

map f (x:xs) = f x : map f xs

estou no caminho certo?

É isso mesmo.

Agora altera essa função de forma se manter igual, excepto que vai receber um novo paramentro que será o indice da lista para ignorar. Ou seja, aplica a função a todos elementos da lista excepto no índice indicado.

Isto é,

map2 :: (a -> a) -> [a] -> Int -> [a]

-- ex: map (2*) [1,2,3,4,5] 3
-- Resultado: [2, 4, 6, 4, 10]

Se tiveres isto feito, fazeres a versão mais optimizada para o problema inicial será então simples :P


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.