Desintegration Posted November 15, 2015 at 10:06 PM Report Share #589751 Posted November 15, 2015 at 10:06 PM (edited) Boas alguém me pode esclarecer como fazer estas duas funções 1ª replace :: Int -> [a] -> [a] -> [a] (exemplo: replace 2 ['a','b','c','d'] [z] ['a','b','z','d'] o "a" é a 0 posição sendo a 2 posição o "c" fazendo replace do "c" pelo "z" 2ª replace Tab tab -> (Int,Int) -> tab Edited November 15, 2015 at 10:25 PM by thoga31 Tags code + GeSHi Link to comment Share on other sites More sharing options...
thoga31 Posted November 15, 2015 at 10:28 PM Report Share #589753 Posted November 15, 2015 at 10:28 PM Sim, podemos ajudar. Quais são as dúvidas que pretendes ver esclarecidas? Knowledge is free! Link to comment Share on other sites More sharing options...
Desintegration Posted November 16, 2015 at 05:52 PM Author Report Share #589804 Posted November 16, 2015 at 05:52 PM Gostava de saber se existe alguma função que tire os cardinais de um tabuleiro ou os substitui com a função replace. Link to comment Share on other sites More sharing options...
thoga31 Posted November 16, 2015 at 06:45 PM Report Share #589810 Posted November 16, 2015 at 06:45 PM (edited) Gostava de saber se existe alguma função que tire os cardinais de um tabuleiro ou os substitui com a função replace. Então o intuito da função é substituir um caracter por outro ou é substituir parte de uma lista por outra? É que a primeira declaração da tua função replace não reflecte em nada aquilo que acabaste de dizer. EDIT: esclarece a tua segunda declaração. Nós não sabemos o que é "tab" (que nem sequer é um tipo de dados segundo as regras sintácticas do Haskell) e não sabemos como é suposto ela ser utilizada. Edited November 16, 2015 at 06:48 PM by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
Desintegration Posted November 16, 2015 at 06:49 PM Author Report Share #589811 Posted November 16, 2015 at 06:49 PM A função replace substitui uma parte de uma lista por outra, como dei no exemplo, contudo esta substituição realiza-se usando "0,1,2,3.." dependendo da posição da parte que quero substituir. Link to comment Share on other sites More sharing options...
thoga31 Posted November 16, 2015 at 06:54 PM Report Share #589812 Posted November 16, 2015 at 06:54 PM A função replace substitui uma parte de uma lista por outra, como dei no exemplo, contudo esta substituição realiza-se usando "0,1,2,3.." dependendo da posição da parte que quero substituir. Portanto, se eu tiver a lista "abcde" e mandar substituir na posição 3 (4º caracter) por "xyz", resultará "abcxyz". É isto? Ou fica "abcxyze"? É que convém esclareceres bem estas questões com exemplos claros. A implementação da função vai variar imenso com base nestes pormenores. Knowledge is free! Link to comment Share on other sites More sharing options...
Desintegration Posted November 16, 2015 at 06:58 PM Author Report Share #589814 Posted November 16, 2015 at 06:58 PM Exatamente, de facto o meu exemplo não foi nada esclarecedor mas sim se tiver a lista "abcde" e mandar substituir na posição 3 irei obter "abcxyze", pois apenas substitui a parte nessa posição. Link to comment Share on other sites More sharing options...
thoga31 Posted November 16, 2015 at 07:09 PM Report Share #589815 Posted November 16, 2015 at 07:09 PM (edited) Ok, então aquilo que precisas é uma função que vá "consumindo" o contador de posição - quando for 0 (zero), é feita a substituição: POSIÇÃO LISTA ORIGINAL LISTA RESULTANTE SUBLISTA 3 abcde a xyz 2 bcde ab xyz 1 cde abc xyz * Opção 1: 0 de abcx yz 0 e abcxy z 0 e abcxyz [] 0 [] abcxyze [] * Opção 2: 0 [] abcxyze [] Na opção 1 fazes a substituição caracter a caracter até teres a nova lista construída. Aqui é usado constantemente o operador ( : ). Na opção 2 é feita a substituição num só passo usando o operador (++). replace :: Int -> [a] -> [a] -> [a] replace -- caso em que a primeira lista é vazia replace -- caso em que a segunda lista é vazia replace -- caso em que o contador é zero replace -- caso em que o contador é 'n' (não é zero) Consegues começar a preencher os espaços em branco tendo em conta o algoritmo que te indiquei? Edited November 16, 2015 at 07:10 PM by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
Desintegration Posted November 16, 2015 at 07:20 PM Author Report Share #589816 Posted November 16, 2015 at 07:20 PM Não 😕 Link to comment Share on other sites More sharing options...
thoga31 Posted November 16, 2015 at 10:41 PM Report Share #589818 Posted November 16, 2015 at 10:41 PM Tens de pensar um pouco. Cada linha que escrevi vai definir o comportamento da função para diferentes casos (padrões) - a isto chamamos de pattern matching. Vou exemplificar o primeiro padrão (pattern): caso em que a primeira lista é vazia. Sendo a primeira lista aquela que vai ser alvo de "intervenção", quando esta está vazia, nada há a substituir, independentemente do valor inteiro. Portanto: replace _ [] _ = [] No segundo caso - caso em que a segunda lista é vazia -, também não há nada a substituir, pelo que devemos manter a primeira lista as is: replace _ xs [] = xs Agora, quando o contador não é zero, tu vais adicionar o elemento seguinte da lista ao resultado e decrementar o contador em uma unidade, chamando a função de forma recursiva: replace n (x:xs) ys = -- 1. Adicionar um elemento da lista ao resultado -- 2. Chamar recursivamente a função 'replace'. Por fim, replace 0 (_:xs) ys = -- 1. O elemento actual é ignorado - daí estar marcado com underscore -- 2. Adicionamos a lista de substituição e o restante conteúdo da lista original Knowledge is free! Link to comment Share on other sites More sharing options...
Desintegration Posted November 16, 2015 at 11:50 PM Author Report Share #589819 Posted November 16, 2015 at 11:50 PM Ok, já entendi muito obrigado pelo esclarecimento. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now