adamc@88: signature S = sig adamc@88: con nm :: Name adamc@88: con r :: {Type} adamc@88: adamc@88: constraint [nm] ~ r adamc@88: end adamc@88: adamc@88: structure M : S = struct adamc@88: con nm = #A adamc@88: con r = [B = float, C = string] adamc@88: adamc@88: constraint [A] ~ [B] adamc@88: constraint [nm] ~ r adamc@88: constraint [C] ~ [D] adamc@88: end adamc@88: adamc@88: structure M' = struct adamc@88: open M adamc@88: adamc@88: con combo = [nm = int] ++ r adamc@88: end adamc@88: adamc@88: structure M' = struct adamc@88: open constraints M adamc@88: adamc@88: con nm' = M.nm adamc@88: con r' = M.r adamc@88: con combo = [nm' = int] ++ r' adamc@88: end adamc@89: adamc@89: adamc@89: signature S' = sig adamc@89: con r1 :: {Type} adamc@89: con r2 :: {Type} adamc@89: adamc@89: constraint r1 ~ r2 adamc@89: end adamc@89: adamc@89: functor F (M : S) : S' = struct adamc@89: con r1 = [M.nm = int] adamc@89: con r2 = M.r adamc@89: adamc@89: open constraints M adamc@89: constraint r1 ~ r2 adamc@89: end