[make specialize handle rank-n meets rank-n properly.
John Meacham <john@repetae.net>**20060228071410] hunk ./E/FromHs.hs 41
+import FrontEnd.KindInfer(hoistType)
hunk ./E/FromHs.hs 44
+import qualified FrontEnd.Tc.Monad as TM
hunk ./E/FromHs.hs 509
-specialize TForAll {} TForAll {} = []  -- we assume program is typesafe
-specialize g@(TForAll vs (_ :=> t)) s = snds (gg t s)  where
+specialize (TForAll vs _) (TForAll vs' _) | sameLength vs vs'= []  -- we assume program is typesafe
+specialize (TForAll vs (ps :=> t)) b@(TForAll vs' _) | length vs' < length vs = specialize' (TForAll rs (ps :=> TForAll ls ([] :=> t))) b where
+    nd = length vs - length vs'
+    (rs,ls) = splitAt nd vs
+specialize x y = specialize' x y
+
+specialize' g@(TForAll vs (_ :=> t)) s = snds (gg t s)  where
hunk ./E/FromHs.hs 524
-    gg' (TForAll as (_ :=> ta)) (TForAll bs (_ :=> tb)) | length as == length bs = gg' ta tb -- assume names are unique
+    gg' (TForAll as1 (_ :=> r1)) (TForAll as2 (_ :=> r2)) | sameLength as1 as2 = do
+      let r2' = TM.inst mempty (Map.fromList [ (tyvarAtom a2,TVar a1) | a1 <- as1 | a2 <- as2 ]) r2
+      gg' r1 r2' -- assume names are unique
hunk ./E/FromHs.hs 528
-specialize _g _s = []
+specialize' _g _s = []