signature INT = sig val i: int end; signature REAL = sig val r: real end; functor Foo1(structure I: INT and R: REAL) = struct end; functor Foo2(structure I: INT; structure R: REAL) = struct end; functor Foo3(structure I: INT and R: REAL; val x : int) = struct end; structure Int = struct val i = 0 end; structure Real = struct val r = 0.0 end; structure Bar = Foo1(structure I = Int; structure R = Real); structure Bar = Foo1(structure I = Int and R = Real); structure Bar = Foo2(structure I = Int; structure R = Real); structure Bar = Foo2(structure I = Int and R = Real); structure Bar = Foo3(structure I = Int; structure R = Real; val x = 2); structure Bar = Foo3(structure I = Int and R = Real; val x = 2);