do { module X = { public type T = Int; public let x : T = 1; }; type T = X.T; let x = X.x; let y = X.x + 1; }; do { module X = { public type T = (A,A); public let x : T = (1, 2); }; type T = X.T; let x = X.x; let (x1, x2) : T = X.x; assert (x1 == 1); assert (x2 == 2); }; do { module X = { public module X = { public type T = (A, A); public let x : T = (1, 2); }; }; type T = X.X.T; let x = X.X.x; let (x1, x2) : T = X.X.x; assert (x1 == 1); assert (x2 == 2); }; do { module X = { public module X = { public type T = (A, A); public let x : T = (1, 2); }; }; module Y = { public type T = X.X.T; public let x = X.X.x; public let (x1, x2) : T = X.X.x; }; let _ = assert (Y.x1 == 1); let _ = assert (Y.x2 == 2); type U = (X.X.T,Y.T); };