On Tue, Oct 8, 2013 at 10:43 PM, Thiago Negri <evohunz@gmail.com> wrote:
data Queue a = Queue [a]

empty :: Queue a
empty = Queue []

push :: a -> Queue a -> Queue a
push a (Queue as) = Queue (a:as)

pop :: Queue a -> Maybe (a, Queue a)
pop (Queue []) = Nothing
pop (Queue (a:as)) = Just (a, Queue as)

This is not a queue!

This is a stack, a Last In First Out structure.

Queues are First In First Out.

Here, I'll help you with the quickcheck instance:

instance (CoArbitrary a, Arbitrary b) => Arbitrary (SP a b)  where
   arbitrary = oneof [liftM2 Put arbitrary arbitrary, liftM Get arbitrary]

Also, we need a dummy show:

instance (Show a, Show b) => Show (SP a b)  where
   show _ = error "SP a b: no show"

The test you need to write is the following:

prop_SP_first :: SP Int Int -> [(Int,Int)] -> Bool
prop_SP_first f xs = x1 == x2  where
   -- your name is thiago and you WILL be cool once you've fixed your buggy code


-- Kim-Ee