[MLton] Structures inside a function?

Matthew Fluet fluet@cs.cornell.edu
Wed, 19 Jan 2005 20:22:57 -0500 (EST)


> Hi! I recently ran into a problem where I needed to use a structure inside a
> function. However, this doesn't appear to be possible; what do I do instead?

Generally, I think you need to refactor things.  

Perhaps you can make ResidueWithoutModulus and MathWithoutModulus functors 
that parameterize each function requiring the modulus with the explicit 
modulus argument.

You can then make Residue and Math essentially special cases of the above, 
where you have the modulus up front and can simplify the exported 
functions to not have the modulus argument.

Then you could write:

functor Factor(E : EUCLIDEAN_DOMAIN) =
  struct
    structure R = ResidueWithoutModulus(struct structure Base = E)
    structure M = MathWithoutModulus(R)

    fun factor x =
      let
	open M
        val f1 = f1 x
        val f2 = f2 x
      in
        (* use various methods defined in Math to factor x *)
      end
  end

where each of the fi functions are from the MathWithoutModulus functor.

> I have run into this in several other places, but have always avoided
> the problem. Here, I don't see any choice other than to redefine all the
> methods I need from Math (lots) in local scope, which really sucks.

Hopefully the refactoring above will require you just to seed each of the 
MathWithoutModulus functions with the modulus.