[Haskell] Queues / Lists with unbound tails
Claus Reinke
claus.reinke at talk21.com
Sat May 8 17:00:23 EDT 2004
> I'm trying to write a simple fifo queue of fixed length (containing type
> Maybe a - it would be initialised to Nothings) where pushing an item pops
> the "last" item "off the end".
> However, it seems to me that there should be another solution, with a
> lazily constructed list whose tail does not yet exist. The queue would
> consiste of the head of the list (which is the "tail" of the queue!) and a
> closure that extends the list tail (ie the queue head).
>
> Pushing an element would involve invoking the closure, extending the tail
> of the (lazily constructed) list, and returning another closure to
> continue the process. The return ("pop") value would be the head of the
> list, with the next item carried forward as the next return value.
You can't really pop from a fixed-length queue. Apart from that,
something like this?
initQ n = foldr (.) id $ take n $ repeat (Nothing:)
pushQ front q = tail . q . (front:)
peekQ q = (head $ q [], q)
Cheers,
Claus
----------- Testing:
toList q = q []
instance Show a=>Show ([Maybe a]->[Maybe a]) where
showsPrec _ = showList . toList
x = initQ 3
xx = pushQ (Just 2) x
xxx = pushQ Nothing xx
xxxx = pushQ Nothing xxx
y = peekQ xxxx
*Main> :r
Ok, modules loaded: Main.
*Main> x
[Nothing,Nothing,Nothing]
*Main> xx
[Nothing,Nothing,Just 2]
*Main> xxx
[Nothing,Just 2,Nothing]
*Main> xxxx
[Just 2,Nothing,Nothing]
*Main> y
(Just 2,[Just 2,Nothing,Nothing])
More information about the Haskell
mailing list