@@ -68,6 +68,7 @@ import Control.Applicative
68import Control.Arrow (Arrow(..))
68import Control.Arrow (Arrow(..))
70import qualified Data.Map as M
70import qualified Data.Map as M
71+import qualified Data.HashMap.Strict as H
71import Data.Function (on)
72import Data.Function (on)
72import Data.Ord (comparing)
73import Data.Ord (comparing)
73import Data.Monoid ((<>))
74import Data.Monoid ((<>))
@@ -76,6 +77,16 @@ instance Partial Type where
76 unknown = TUnknown
77 unknown = TUnknown
77 isUnknown (TUnknown u) = Just u
78 isUnknown (TUnknown u) = Just u
78 isUnknown _ = Nothing
79 isUnknown _ = Nothing
80+ unknowns = everythingOnTypes (++) go
82+ go (TUnknown u) = [u]
84+ ($?) sub = everywhereOnTypes go
86+ go t@(TUnknown u) = case H.lookup u (runSubstitution sub) of
80instance Unifiable Check Type where
91instance Unifiable Check Type where
81 (=?=) = unifyTypes
92 (=?=) = unifyTypes
@@ -494,9 +505,9 @@ varIfUnknown ty =
494 toName = (:) 't' . show
505 toName = (:) 't' . show
495 ty' = everywhereOnTypes typeToVar ty
506 ty' = everywhereOnTypes typeToVar ty
496 typeToVar :: Type -> Type
507 typeToVar :: Type -> Type
497− typeToVar (TUnknown (Unknown u)) = TypeVar (toName u)
508+ typeToVar (TUnknown u) = TypeVar (toName u)
498 typeToVar t = t
509 typeToVar t = t
499− in mkForAll (sort . map (toName . runUnknown) $ unks) ty'
510+ in mkForAll (sort . map toName $ unks) ty'
502-- Remove any ForAlls and ConstrainedType constructors in a type by introducing new unknowns
513-- Remove any ForAlls and ConstrainedType constructors in a type by introducing new unknowns
@@ -791,13 +802,13 @@ checkBinders nvals ret (CaseAlternative binders grd val : bs) = do
791-- Generate a new skolem constant
802-- Generate a new skolem constant
793newSkolemConstant :: UnifyT Type Check Int
804newSkolemConstant :: UnifyT Type Check Int
794−newSkolemConstant = runUnknown <$> fresh'
805+newSkolemConstant = fresh'
797-- Generate a new skolem scope
808-- Generate a new skolem scope
799newSkolemScope :: UnifyT Type Check SkolemScope
810newSkolemScope :: UnifyT Type Check SkolemScope
800−newSkolemScope = SkolemScope . runUnknown <$> fresh'
811+newSkolemScope = SkolemScope <$> fresh'
803-- Skolemize a type variable by replacing its instances with fresh skolem constants
814-- Skolemize a type variable by replacing its instances with fresh skolem constants
@@ -1109,3 +1120,4 @@ subsumes' val ty1 ty2 = do