[MLton] Structures inside a function?

Matthew Fluet fluet@cs.cornell.edu
Fri, 21 Jan 2005 11:18:13 -0500 (EST)


> 
> > > functor GroupMulPercent(G : GROUP) = 
> > >   struct
> > >     val (op *%) = G.MUL
> > >     val (op /%) = G.DIV
> > >     val (op !%) = G.INV
> > >     ...
> ...
> > That is an interesting technique for quickly generating different 
> > bindings.
>
> I might even go further and drop the percents.
> 
> functor GroupOps (structure G: GROUP) =
>    struct
>       val op * = G.MUL
>       val op / = G.DIV s
>       val op ! = G.INV s
>       ...
>    end
> 
> The point being that you open the result of GroupOps in situations
> where the usual definitions of the arithmetic ops might be
> unnecessary, or it might be worth the conciseness to use qualified
> identifiers for the usual functions (because they are in that context
> unusual).

I suspect that you really want a whole family of functors:

functor GroupOps (structure G : GROUP) = ...
functor GroupOpsPercent (structure G : GROUP) = ...
functor GroupOpsDollar (structure G : GROUP) = ...
functor GroupOpsHash (structure G : GROUP) = ...

If you are in a situation where you are only working with one group and 
the usual definitions of the arithmetic ops are unnecessary, use GroupOps.
If you are in a situation where you are working with multiple groups,
use GroupOpsPercent and GroupOpsDollar to get two sets of (distinguished) 
functions.