Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

aalex

duvida em chamar a recurcividade

Mensagens Recomendadas

aalex

estou a tentar desenvolver uma função que faça o seguinte, pegue em uma lista [(a,b),(c,d),(e,f),...] e faça o seguinte [(c-a,d-b),(e,f),...] -> (e-c-a,f-d-:)...

espero que tenham percebido  :hmm:

type Time (Int,Int)
tempoesperaVarias :: [Time]->Time
tempoesperaVarias [] = (0,0)
tempoesperaVarias (h:[]) = h
tempoesperaVarias (h1:h2:hs) = (fst h2 - fst h1, snd h2 - snd h1) && tempoesperaVarias hs

o problema é que não estou a ver como chamar ai a recursividade  :) :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

A chamada recursiva nunca pode ser com o operador &&, porque esse trabalha sobre Bools e não sobre Time.

Mesmo assim, e conhecendo eu esse problema, acho que estás a complicar o que é simples. Para calcular o tempo de espera entre viagens, basta calcular a diferença entre a hora de chegada de uma viagem e o tempo de partida da próxima e ir somando esses resultados.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aalex

de facto tem razão

porque o que eu quero receber é isto [((1,10),(1,20)),((1,25),(1,30))...] e calcular (1-1,25-20)

tenho este codigo ja feito mas não esta a resultar  :wallbash:

tempoesperaTotal :: [(Time,Time)]->Time
tempoesperaTotal [()] = (0,0)
tempoesperaTotal [(h:[])] = (0,0)
tempoesperaTotal [((h:hs):ts)] = (fst (fst hs) - snd (fst h), fst (snd hs) - snd (snd hs))

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

O caso para a lista vazia tem de ser mesmo com uma lista vazia: []. Não pode ser como tens, porque o que tu tens é uma lista com um unit lá dentro, que é um tipo de dados que não é sequer um par:

data () = ()

No 2º caso estás a cometer outra vez o mesmo erro de teres uma lista de listas.

No 3º caso estás a colocar dois pontos entre o h e o hs, mas parece-me que é uma vírgula. Ou então não percebi o que fizeste. Seja como for estás outra vez a usar uma lista de listas.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aalex

:wallbash:

:)

bem vamos la por partes que já me esta a dar cabo da cabeça isto

por exemplo se eu tiver este caso [((a1,a2),(a3,a4)),((b1,b2),(b3,b4))] como posso definer = (a3-a1,a4-a2)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous
type Hora = Double
type Etapa = (Hora,Hora)
type Viagem = [Etapa]

v1 = [(9.5,10.25),(11.3,12.75),(13.5,14.75)] :: Viagem

tempoEspera :: Viagem -> Double
tempoEspera [] = 0
tempoEspera (h:[]) = 0
tempoEspera (h1:h2:t) = (fst h2 - snd h1) + tempoEspera (h2:t)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aalex

isso da-me um Bool e não um par de Int

eu pretendia dar (horas,min) (horas,min) ... = (horas,min)

so que nao estou a ver como numa lista [((a1,a2),(b1,b2)), ((c1,c2),(c3,c4)), ... ] vou buscar o a1, o a2, o b1....    tentei (fst (fst (a1,a2)) e não resultou

:dontgetit:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

isso da-me um Bool e não um par de Int

Não dá um Bool, devolve um Double.

eu pretendia dar (horas,min) (horas,min) ... = (horas,min)

so que nao estou a ver como numa lista [((a1,a2),(b1,b2)), ((c1,c2),(c3,c4)), ... ] vou buscar o a1, o a2, o b1....    tentei (fst (fst (a1,a2)) e não resultou

:dontgetit:

Vê se assim dá:

tempoEspera (((a1,a2),(b1,b2)):t) = (b1-a1+x,b2-a2+y)
    where (x,y) = tempoEspera t

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.