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

Baderous

Classe Show

Recommended Posts

Baderous

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...

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
Baderous

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?

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
Baderous

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

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.