nuno35 0 Posted January 4, 2019 Report Share Posted January 4, 2019 (edited) 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 Edited January 10, 2019 by thoga31 GeSHi Link to post Share on other sites
thoga31 577 Posted January 10, 2019 Report Share Posted January 10, 2019 (edited) 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. Edited January 10, 2019 by thoga31 Ortografia Knowledge is free! Link to post Share on other sites
nuno35 0 Posted January 10, 2019 Author Report Share Posted January 10, 2019 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 Link to post Share on other sites
thoga31 577 Posted January 11, 2019 Report Share Posted January 11, 2019 (edited) 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. Edited January 11, 2019 by thoga31 Knowledge is free! Link to post Share on other sites
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