[Haskell] Why is newChan in the IO Monad?

Alastair Reid alastair at reid-consulting-uk.ltd.uk
Mon Apr 26 14:35:56 EDT 2004

On Friday 23 April 2004 20:05, S. Alexander Jacobson wrote:
> Yes, that makes sense, but I'm ok with passing in
> an identity.  I'd like a function like this:
>   newChanSafe::Identity -> Chan a
>   type Identity = Double -- or whatever

As Nick observes, using this function would require you to pass around a 
supply of unique Identitys.  If we assume you're going to have to do this, 
why not simplify things and pass around a list of newChans:

  type Identity = Chan Int
  withChan :: (Identity -> a) -> [Identity] -> (a,[Identity])

You can use unsafeInterleaveIO to create a lazy list of channels.
Better yet, you can use unsafeInterleaveIO to create a lazy
 tree of channels so that splitting the supply is efficient.

One minor detail left as an exercise: my definition of Identity is monomorphic 
but you probably want them to be polymorphic.  This is a bit tricky to fix 
and will require a monad (or equivalent) to ensure that you don't allocate 
the same chan twice and then use it at different types.  (Probably requires 
unsafeCast too.)

Alastair Reid 

More information about the Haskell mailing list