[MLton] Structures inside a function?

Matthew Fluet fluet@cs.cornell.edu
Thu, 20 Jan 2005 22:20:48 -0500 (EST)


> Having mused briefly before seeing your reply, I was going to make another
> point, which was that functors with non-type arguments are in some sense
> suspect, because they cannot be instantiated in a local (expression)
> scope.  I many situations, this isn't a problem; but in some, it really
> can be.  For example, I believe that the Standard ML Basis Library has
> such a problem with regards to the IO stream and sockets; namely, I don't
> believe that there is a way to open a socket (a core-level operation) and
> then lift that socket through the IO functors (a module-level operation)
> to get an IMPERATIVE_IO structure for reading from the socket.  (There is
> a degenerate mechanism by opening the socket at the top-level, but then
> you can't recover from errors nicely.)

I have to retract this comment about the Basis Library, as the book
version shows explicitly how to do this in Listing 10.2.  Interestingly,
the style of the code looks like:

fun mkStreams (sock) =
  let
    ...
    val rd = BinPrimIO.RD {...}
    val wr = BinPrimIO.WR {...}
    val inStrm = BinIO.mkInstream(BinIO.StreamIO.mkInstream(rd,...))
    val outStrm = BinIO.mkOutstream(BinIO.StreamIO.mkOutstream(wr,...))
  in
    (inStrm,outStrm)
  end

which is very similar to what I proposed: collect all the relevant
functions in a record, then pass it up through mk* functions when they
depend upon a core-level value.

So, this is probably where I had the idea in the back of my mind.