The answer to yesterdays quiz is: Yes, types are necessary for lambda-lifting refactoring. Namely, if the lifted function contains an overloaded operator such as, e.g., +
.
For example, given the program:
fun foo x = let fun add y = x + y in add 5.0 end
where we want to lift the function add
. Our first attempt might be to transform the program into something like (refactoring is a source code to source code transformation):
fun add x y = x + y fun foo x = add x 5.0
However, this might not compile with every SML compiler. It depends on how much local context the compiler uses to resolve overloading.
Moscow ML compiles the transformed program above just fine. But Moscow ML complains about the following version:
fun add x y = x + y; fun foo x = add x 5.0
Notice the extra semi-colon after the declaration of add
.
Update 2005-12-22:
Just for good messure. Here is one possible result of refactoring with necessary type information:
fun add (x : real) y = x + y; fun foo x = add x 5.0
I believe that only captured variables needs to be typed.
Also note, that overloading is not the only problem. It is possible to construct a similar example using records, but I’ll leave that to the reader (unless there is a popular and desperate demand, then I can provide an example).