Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Polmax

Subtrair datas

Recommended Posts

Polmax

eu tenho data DataN = D Dia Mes Ano        que ja foram declarados como Int

quero saber como pego neste DataN e subtraio a outro DataN

ou seja 11 12 93 e 3 12 94 iria devolver 1 que seria uma idade no caso (so quero subtrair o ano)

eu tenho

idade :: DataN -> Nome -> TabDN -> Maybe Int

idade d n [] = Nothing

idade d n (x:xs) | n == (fst x) = Just ( aqui quero pegar no x e subtrair d , tendo em conta que x é um tuplo e que so me interessa o segundo valor deste tuplo porque o primeiro é uma string ou seja TabDN :: [(Nome,DataN)]  )

                | otherwise = d n xs

 

Share this post


Link to post
Share on other sites
Baderous

Fazes uma função auxiliar para isso:

subDataN :: DataN -> DataN -> Int
subDataN (D d1 m1 a1) (D d2 m2 a2) = ...

Share this post


Link to post
Share on other sites
Polmax

ou seja

idade :: DataN -> Nome -> TabDN -> Maybe Int

idade d n [] = Nothing

idade d n (x:xs) | n == (fst x) = Just subData d - x (agora supostamente eu teria que usar pattern matching e usar so o DataN da cabeça mas eu nao sei fazer isso :X )

                | otherwise = d n xs

      where subData ::DataN -> DataN -> Int

            subData (D a1 b1 c1) (D a2 b2 c2) = c1-c2

Share this post


Link to post
Share on other sites
Baderous

Não invocas subData d - x, o d e o x são 2 parâmetros passados à função subData. Além disso, se x é um par com um DataN no 2º elemento tens de lhe aceder:

idade d n (x:xs) | n == (fst x) = Just (subData d (snd x))

Share this post


Link to post
Share on other sites
Polmax

obrigado o erro que disseste eu logo que escrevi a mensagem vi , nem tinha notado que tinha escrito aquilo.

ja funciona . outra coisa neste caso fst e snd da jeito pk sao so dois elementos mas e se for um tuplo com 3 , 4 etc ? tenho que definir outra funçao auxiliar ?

ou poderia por exemplo fazer algo assim    idade d n ((nome,nacionalidade,data):xs) | n == nome = Just (subData d data

)

Share this post


Link to post
Share on other sites
Baderous

Podes fazer das duas maneiras.

A 2ª solução é um caso de pattern-matching. Estás a dizer que o 1º elemento da lista segue o padrão de um tuplo (onde dás um identificador a cada elemento que te interesse manipular).

Share this post


Link to post
Share on other sites
Polmax

obs estava a usar data que é um nome reservado, nem me lembrei e agora ja percebo melhor o pattern matching

muito obrigado ;)

agora é enfrentar o teste

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

×

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.