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

nuno35

Tipo de dados

Mensagens Recomendadas

nuno35

Boa tarde
Tenho este tipo de dados:

data exp = Variavel Char | Inteiro Int | Mais Exp Exp | Vezes Exp Exp

para escrever isto tipo de expressao 3(x+2y)

let expr = Vezes (Inteiro 3) (Mais (Variavel 'x')(Vezes (Inteiro 2) (Variavel 'y')))

e agr tenho de fazer uma funcao que de o comprimento da expressao o comprimento e dado pelo numero de operadores (Mais e Vezes)

ghci> comprimento expr
3

Como posso fazer esta funcao ? desde ja obrigado

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Podes fazer pattern match desta forma:

comp (Vezes x y) = 1 + comp x + comp y
comp (Mais x y) = 1 + comp x + comp y
comp _ = 0

Cumprimentos.

Editado por thoga31
Ortografia

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nuno35

Muito Obrigado já consegui perceber onde é que esta a falhar já agr tenho aqui outra duvida tenho este tipo de dados:

data Doc = Vazio|Texto String|NovaLinha|Concat Doc Doc

e tenho de fazer este tipo ser uma instancia da classe Eq e dois documentos se tiverem a mesma representação textual eu fiz assim mas nao sei se esta correto:

instance eq Doc where
(==) doc1 doc2 = doc1 == doc2
(/=) doc1 doc2 = doc1 /= doc2

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Suponho que não esteja certo pois o Haskell não sabe comparar duas instâncias do tipo Doc, daí a necessidade de seres tu quem tem de dizer como deve fazer a comparação.

Assim de primeiro relance, faria uma função para determinar se dois Doc são iguais, podendo simplificar desta forma a instância Eq Doc:

instance Eq Doc where
	(==) d1 d2 = docEqual d1 d2
	(/=) d1 d2 = not . docEqual d1 $ d2

Para tal, precisas de construir a função docEqual:

docEqual :: Doc -> Doc -> Bool
docEqual (Vazio)        (Vazio)        = True
docEqual (NovaLinha)    (NovaLinha)    = True
docEqual (Texto xs)     (Texto ys)     = xs == ys
docEqual (Concat d1 d2) (Concat d3 d4) = (docEqual d1 d3) && (docEqual d2 d4)
-- to be continued...

Não fiz todos os casos possíveis, além de que outras funções auxiliares podem vir a ser necessárias.

Outra forma mais simples será construir uma função que crie a String que Doc representa e assim bastará comparar Strings.

Cumprimentos.

Editado por thoga31

Knowledge is free!

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.