
On Thu, Jan 07, 2010 at 08:39:59PM +0100, Bas van Dijk wrote:
Another solution might be to encode the resources that a region opens as constraints. I think 'control-monad-exception' uses a similar technique to encode all the exceptions that a monadic computation may throw.
Yes, yes, that's what I had in mind, thanks for bringing it up. Although it isn't exatcly beautiful, GHC can infer the types and it works.
My previous program could then possibly be written as something like:
openBoth ∷ ( resources `Contains` Device , resources `Contains` File ) ⇒ Device → FilePath → RegionT resources pr () openBoth usbDevice filePath = do h1 ← open usbDevice h2 ← openFile filePath ReadMode return ()
I just don't see yet (maybe because I'm not well versed in monadic regions) how runRegionT will work. When working with exceptions, I have to provide a datatype that implements all the type classes I've used in my program. Hmmm... Perhaps an internal data type that is exposed and other modules instantiate? Cheers, -- Felipe.