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

Baderous

Classe Show

5 mensagens neste tópico

Tenho aqui um exercício onde tenho de produzir o seguinte output:

> show (Histo ('a',10),('b',1),('c',5)])

'a'**********

'b'*

'c'*****

Para isso fiz isto:

data Histograma a = Histo [(a,Int)]

instance Show a => Show (Histograma a) where
show (Histo []) = ""
show (Histo ((a,b):xs)) = show a ++ replicate b '*' ++ "\n" ++ show (Histo xs)

O problema é que a mudança de linha não ocorre, ou seja, o \n é adicionado à string e aparece como \n e não faz o efeito devido. Como resolvo?

E já agora, como é que sei que função é que hei-de definir ao criar uma instância da classe Show? showsPrec? shows (esta diz-me que não é um método visível da classe Show)? show? Eu percebo o conceito de classe e instância mas isto de existirem estas funções todas na classe, eu penso sempre que tenho que apresentar uma definição para cada uma delas na instância onde estou a trabalhar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse resultado só é possível quando escreves Histo [('a',10),('b',1),('c',5)] (sem o show). Neste caso ele vai usar o show para imprimir o histograma. se fazes show (Histo [('a',10),('b',1),('c',5)]), então aquilo que vai ser impresso é a string resultante de aplicar a função show ao histograma, e não o próprio histograma (se reparares, neste caso, também são impressas " no início e no fim).

Ou seja, o que fizestes está correcto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, distracção minha. E relativamente à outra dúvida, eu costumo ver definições onde se usam as funções showsPrec e shows e não se usa show, mas normalmente faço tudo com show. Há algum problema em fazer isso assim?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que esse tipo de funções faz mais falta quando tem questões de precedências (tipo para imprimir funções aritméticas, e só usares parêntesis quando é realmente necessário).

A função show ou a função showsPrec são suficientes para criar a instância. Tendo uma delas, há uma definição por omissão para as outras à custa da primeira.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, também foi nesse âmbito das expressões aritméticas que vi a utilização dessas funções. Sendo assim fico esclarecido. Obrigado.

0

Partilhar esta mensagem


Link 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