http://csg.lcs.mit.edu/~earwig/haskell-lib/index.html
You can create a splittable supply of channels using > chanSupply <- ioSupply newChan
Nonetheless, the problem of generating polymorphic channels is still (as Alastair suggests) a bit of an exercise. You will need to create a polymorphic wrapper for the result of "newChan".
-Jan-Willem Maessen [EMAIL PROTECTED]
Alastair Reid wrote:
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
_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell