On Wednesday 18 January 2006 11:33, Simon Peyton-Jones wrote:
I really like the way you use a set of constraints (IN m1 ms, IN m2 ms, IN m3 ms) to maintain the set of marks. Previously I've thought of using a nested tuple type (m1, (m2, (m3 ()))) to maintain the set, but that is far less convenient. Very neat.
Nested tuples are more or less what the previous version (the one at http://okmij.org/ftp/Haskell/types.html#monadic-regions) was based on. (HLists are really almost the same as nested tuples).
Why do you need the instance IN () b
As I understand it, one instance for some (arbitrary) type is needed so that an ordinary handle can be marked before passing it to a procedure passed as argument. For instance, in function 'withFile' the handle we get from openFile is marked by writing (Q handle) :: Q () Instead of '()' one could use an empty data type as well, like this: data Mark instance IN Mark b ... withFile path proc = ... (\handle -> unIOM $ proc ((Q handle) :: Q Mark))) or a bit nicer: data Mark instance IN Mark b mark :: Handle -> Q Mark mark h = Q h ... withFile path proc = ... (\handle -> unIOM $ proc $ mark handle)) Ben