@@ -68,6 +68,7 @@ import Control.Applicative
6868import Control.Arrow (Arrow(..))
6969
7070import qualified Data.Map as M
71+import qualified Data.HashMap.Strict as H
7172import Data.Function (on)
7273import Data.Ord (comparing)
7374import Data.Monoid ((<>))
@@ -76,6 +77,16 @@ instance Partial Type where
7677 unknown = TUnknown
7778 isUnknown (TUnknown u) = Just u
7879 isUnknown _ = Nothing
80+ unknowns = everythingOnTypes (++) go
81+ where
82+ go (TUnknown u) = [u]
83+ go _ = []
84+ ($?) sub = everywhereOnTypes go
85+ where
86+ go t@(TUnknown u) = case H.lookup u (runSubstitution sub) of
87+ Nothing -> t
88+ Just t' -> t'
89+ go other = other
7990
8091instance Unifiable Check Type where
8192 (=?=) = unifyTypes
@@ -494,9 +505,9 @@ varIfUnknown ty =
494505 toName = (:) 't' . show
495506 ty' = everywhereOnTypes typeToVar ty
496507 typeToVar :: Type -> Type
497− typeToVar (TUnknown (Unknown u)) = TypeVar (toName u)
508+ typeToVar (TUnknown u) = TypeVar (toName u)
498509 typeToVar t = t
499− in mkForAll (sort . map (toName . runUnknown) $ unks) ty'
510+ in mkForAll (sort . map toName $ unks) ty'
500511
501512-- |
502513-- 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
791802-- Generate a new skolem constant
792803--
793804newSkolemConstant :: UnifyT Type Check Int
794−newSkolemConstant = runUnknown <$> fresh'
805+newSkolemConstant = fresh'
795806
796807-- |
797808-- Generate a new skolem scope
798809--
799810newSkolemScope :: UnifyT Type Check SkolemScope
800−newSkolemScope = SkolemScope . runUnknown <$> fresh'
811+newSkolemScope = SkolemScope <$> fresh'
801812
802813-- |
803814-- Skolemize a type variable by replacing its instances with fresh skolem constants
@@ -1109,3 +1120,4 @@ subsumes' val ty1 ty2 = do
11091120
11101121
11111122
1123+