@@ -188,7 +188,7 @@ replaceTypeClassDictionaries mn = everywhereM (mkM go)
188188 go (TypeClassDictionary constraint dicts) = entails mn dicts constraint
189189 go other = return other
190190
191−entails :: ModuleName -> [(Ident, [(Qualified ProperName, Type)], Qualified ProperName, Type)] -> (Qualified ProperName, Type) -> Check Value
191+entails :: ModuleName -> [TypeClassDictionaryInScope] -> (Qualified ProperName, Type) -> Check Value
192192entails moduleName context goal@(className, ty) = do
193193 env <- getEnv
194194 case go env goal of
@@ -196,11 +196,17 @@ entails moduleName context goal@(className, ty) = do
196196 (dict : _) -> return dict
197197 where
198198 go env (className', ty') =
199− [ App (Var (Qualified Nothing fnName)) args
200− | (fnName, subgoals, className'', ty'') <- context
201− , qualify moduleName className' == qualify moduleName className''
202− , subst <- maybeToList $ typeHeadsAreEqual moduleName env ty' ty''
203− , args <- forM (replaceAllTypeVars subst subgoals) (go env) ]
199+ [ mkDictionary (tcdName tcd) args
200+ | tcd <- context
201+ , qualify moduleName className' == qualify moduleName (tcdClassName tcd)
202+ , subst <- maybeToList $ typeHeadsAreEqual moduleName env ty' (tcdInstanceType tcd)
203+ , args <- solveSubgoals env subst (tcdDependencies tcd) ]
204+ solveSubgoals _ _ Nothing = [Nothing]
205+ solveSubgoals env subst (Just subgoals) = do
206+ dict <- mapM (go env) (replaceAllTypeVars subst subgoals)
207+ return $ Just dict
208+ mkDictionary fnName Nothing = Var (Qualified Nothing fnName)
209+ mkDictionary fnName (Just args) = App (Var (Qualified Nothing fnName)) args
204210
205211typeHeadsAreEqual :: ModuleName -> Environment -> Type -> Type -> Maybe [(String, Type)]
206212typeHeadsAreEqual _ _ String String = Just []
@@ -639,7 +645,7 @@ check' val (ConstrainedType constraints ty) = do
639645 dictNames <- flip mapM constraints $ \(Qualified _ (ProperName className), _) -> do
640646 n <- liftCheck freshDictionaryName
641647 return $ Ident $ "__dict_" ++ className ++ "_" ++ show n
642− val' <- withTypeClassDictionaries (zipWith (\name (className, instanceTy) -> (name, [], className, instanceTy)) dictNames (qualifyAllUnqualifiedNames moduleName env constraints)) $ check val ty
648+ val' <- withTypeClassDictionaries (zipWith (\name (className, instanceTy) -> TypeClassDictionaryInScope name className instanceTy Nothing) dictNames (qualifyAllUnqualifiedNames moduleName env constraints)) $ check val ty
643649 return $ Abs dictNames val'
644650check' val u@(TUnknown _) = do
645651 val'@(TypedValue _ ty) <- infer val