Jump to content

Stack com instancias


crislanio_macedo
 Share

Recommended Posts

Como fazer para que a saída do código fique, como pilha de altura ____ e topo ___

dá o seguinte erro.

Expecting one more argument to `Stack'

In the instance declaration for `Show Stack'

Failed, modules loaded: none.

Me ajudem pois eu não sei manipular instancias.

--import Stack --nao importa..

module Stack (Stack, top, mStack, isEmpty) where
data Stack a = Stk [a] deriving (Read, Eq, Ord, Show)
-- | Empty | Top a | (Stack a) deriving (Show)

top (Stk (x:xs)) = x
top _ = error "Stack.top: Pilha vazia"

mStack :: [a] -> Stack a
mStack xs = foldr push empty xs

isEmpty :: Stack a -> Bool                     -- verificar se a pilha está vazia
isEmpty (Stk []) = True
isEmpty _     = False

size :: Stack a -> Int                         -- tamanho da pilha
size s | isEmpty s = 0
    | otherwise = 1 + size (pop s)

-- saida desejada putStr ("Pilha de Altura" >> size ++ " e topo " ++ top ++ "!\n")
Link to comment
Share on other sites

Se o que queres é que sempre que imprimes a stack, ela seja apresentada com essa frase, então tens de criar uma instância de Show para o tipo Stack, e não usar uma instância derivada do tipo (como estás a fazer com o deriving Show), porque isso vai simplesmente fazer o show com base nos tipos usados para definir o tipo Stack, complementado com o show do construtor.

Portanto, para definires a instância que referi, terás de fazer algo do género:

instance (Show a) => Show (Stack a) where
  show st@(Stk s) = "Pilha de altura >> " ++ size st ++ " e topo " ++ top st ++ "!"

Aquela pré-condição (Show a) indica que para fazer o Show (Stack a) é necessário saber fazer o Show dos elementos da stack. Por exemplo, se agora definires um tipo algébrico qualquer e quiseres fazer o show duma stack de elementos desse tipo, tens de ter o show desse tipo definido (via instância derivada ou user-defined).

  • Vote 1
Link to comment
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
 Share

×
×
  • Create New...

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.