Jump to content

Função replace


Desintegration
 Share

Recommended Posts

Boas alguém me pode esclarecer como fazer estas duas funções

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"

replace Tab tab -> (Int,Int) -> tab
Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

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 by thoga31

Knowledge is free!

Link to comment
Share on other sites

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

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 by thoga31

Knowledge is free!

Link to comment
Share on other sites

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

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
 Share

×
×
  • 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.