obj Foo has integer and real and string and boolean; op MakeFoo(integer and real and string and boolean)->Foo; op NotQuiteMakeFoo(integer and real and string and string)->Foo; obj MakeFooType has op(integer and real and string and boolean)->(Foo); obj NotQuiteMakeFooType has op(integer and real and string and string)->(Foo); obj TupleOfMakeFoo has MakeFoo and MakeFoo; op main(f:Foo, mft:MakeFooType, nqmft:NotQuiteMakeFooType) = ( f = MakeFoo(1, 2.5, "xyz", true); mft = nqmft; (* ERROR *) mft = NotQuiteMakeFoo; (* ERROR *) mft = MakeFoo; (* Why is this an ERROR? *) f = mft(1, 2.5, "xyz", true); );