I believe it's to do with the magical way in which
+ is overloaded for reals. To me, this almost verges on being a compiler bug, although I would have to look at the SML97 definition to see exactly what the correct behaviour is meant to be. The overloading over
+ is something of a nasty dark corner in SML, IMHO.
For example, if you define a function that is of type
real * real -> real and pass that as an argument to
foldr2 you get the type error you were expecting:
fun f (x : real * real) = 134.5 foldr2 (f, [1.4, 2.25, 7.0]) stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required]
You can even induce the type error if you just add a type annotation to
op +, which basically led me to the conclusion that it is the overloading of
+ that is causing the mysterious effect.