@@ -14,7 +14,9 @@
14-----------------------------------------------------------------------------
14-----------------------------------------------------------------------------
16{-# OPTIONS_GHC -fno-warn-orphans #-}
16{-# OPTIONS_GHC -fno-warn-orphans #-}
17−{-# LANGUAGE FlexibleInstances, FlexibleContexts, MultiParamTypeClasses #-}
17+{-# LANGUAGE FlexibleInstances #-}
18+{-# LANGUAGE FlexibleContexts #-}
19+{-# LANGUAGE MultiParamTypeClasses #-}
19module Language.PureScript.TypeChecker.Unify (
21module Language.PureScript.TypeChecker.Unify (
20 unifyTypes,
22 unifyTypes,
@@ -157,14 +159,14 @@ unifiesWith _ REmpty REmpty = True
157unifiesWith e r1@(RCons _ _ _) r2@(RCons _ _ _) =
159unifiesWith e r1@(RCons _ _ _) r2@(RCons _ _ _) =
158 let (s1, r1') = rowToList r1
160 let (s1, r1') = rowToList r1
159 (s2, r2') = rowToList r2
161 (s2, r2') = rowToList r2
161 int = [ (t1, t2) | (name, t1) <- s1, (name', t2) <- s2, name == name' ]
163 int = [ (t1, t2) | (name, t1) <- s1, (name', t2) <- s2, name == name' ]
162 sd1 = [ (name, t1) | (name, t1) <- s1, name `notElem` map fst s2 ]
164 sd1 = [ (name, t1) | (name, t1) <- s1, name `notElem` map fst s2 ]
163 sd2 = [ (name, t2) | (name, t2) <- s2, name `notElem` map fst s1 ]
165 sd2 = [ (name, t2) | (name, t2) <- s2, name `notElem` map fst s1 ]
164 in all (\(t1, t2) -> unifiesWith e t1 t2) int && go sd1 r1' sd2 r2'
166 in all (\(t1, t2) -> unifiesWith e t1 t2) int && go sd1 r1' sd2 r2'
166 go :: [(String, Type)] -> Type -> [(String, Type)] -> Type -> Bool
168 go :: [(String, Type)] -> Type -> [(String, Type)] -> Type -> Bool
167− go [] REmpty [] REmpty = True
169+ go [] REmpty [] REmpty = True
168 go [] (TypeVar v1) [] (TypeVar v2) = v1 == v2
170 go [] (TypeVar v1) [] (TypeVar v2) = v1 == v2
169 go [] (Skolem _ s1 _) [] (Skolem _ s2 _) = s1 == s2
171 go [] (Skolem _ s1 _) [] (Skolem _ s2 _) = s1 == s2
170 go _ (TUnknown _) _ _ = True
172 go _ (TUnknown _) _ _ = True