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 _______________________________________________ Haskell mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell
