[Haskell-cafe] Really confused

Mark Carter mcturra2000 at yahoo.co.uk
Wed Sep 21 14:12:54 EDT 2005

I'm trying to define a type called Stream. For now, assume that that the 
type has
3 fields: uid, x, y. X and y represent a point in space that a stream 
occupies, and
uid is a unique identifier for the stream. The uid should be 
"auto-generated". It's
important that streams have an identity so that they can be referred to 
and manipulated.
Streams will
be put together into a list, and they'll eventually need to be able to 
point to one
another. It would be nice to be able to print the  uid, just to show that it

Now it occured to me that what one might want to generate the uids is a 
monad, let's
call it UID. It'll have a function get, which returns another 
identifier. I assumed that
the best solution for the problem would be in terms of monads, because 
calls to get return different results; i.e. there's a bit of state going 
on inside. The
values returned can start from 1, and increment by 1 each time.

I had a look at some documentation at:
and I'm afraid my brain just froze.

I get the idea that
data SM a = SM (S -> (a,S))
maps a state to a result, and a new state. OTOH, looking at

instance Monad SM where
  -- defines state propagation
  SM c1 >>= fc2         =  SM (\s0 -> let (r,s1) = c1 s0
                                          SM c2 = fc2 r in
                                         c2 s1)
  return k              =  SM (\s -> (k,s))

just confuses me no end.

Any pointers, like am I taking completely the wrong approach anyway? I'm 
also puzzled
as to how the initial state would be set.

Yahoo! Messenger - NEW crystal clear PC to PC calling worldwide with voicemail http://uk.messenger.yahoo.com

More information about the Haskell-Cafe mailing list