unify t (TypeVar a) = varBind a t
unify (TypeFunction a b) (TypeFunction a' b') = do
s1 <- unify a a'
- s2 <- unify b b'
+ s2 <- unify (substituteT s1 b) (substituteT s1 b')
return $ s1 `composeSub` s2
unify (Primitive a) (Primitive b) | a == b = return idSub
unify a b = fail $ "cannot unify " ++ show a ++ " with " ++ show b
e' = Map.insert x t' e
(s2, t2) <- ti (Map.map (substituteS s1) e') b
return (s1 `composeSub` s2, t2)
-
algW :: TypedTerm -> Either String Type
algW t = fst . runTI $ do