2 paDictArgType, paDictOfType
5 #include "HsVersions.h"
16 paDictArgType :: TyVar -> VM (Maybe Type)
17 paDictArgType tv = go (TyVarTy tv) (tyVarKind tv)
19 go ty k | Just k' <- kindView k = go ty k'
22 tv <- newTyVar FSLIT("a") k1
23 mty1 <- go (TyVarTy tv) k1
26 mty2 <- go (AppTy ty (TyVarTy tv)) k2
27 return $ fmap (ForAllTy tv . FunTy ty1) mty2
33 tc <- builtin paDictTyCon
34 return . Just $ TyConApp tc [ty]
36 go ty k = return Nothing
38 paDictOfType :: Type -> VM CoreExpr
39 paDictOfType ty = paDictOfTyApp ty_fn ty_args
41 (ty_fn, ty_args) = splitAppTys ty
43 paDictOfTyApp :: Type -> [Type] -> VM CoreExpr
44 paDictOfTyApp ty_fn ty_args
45 | Just ty_fn' <- coreView ty_fn = paDictOfTyApp ty_fn' ty_args
46 paDictOfTyApp (TyVarTy tv) ty_args
48 dfun <- maybeV (lookupTyVarPA tv)
49 paDFunApply dfun ty_args
50 paDictOfTyApp (TyConApp tc _) ty_args
52 pa_class <- builtin paClass
53 (dfun, ty_args') <- lookupInst pa_class [TyConApp tc ty_args]
54 paDFunApply (Var dfun) ty_args'
55 paDictOfTyApp ty ty_args = pprPanic "paDictOfTyApp" (ppr ty)
57 paDFunApply :: CoreExpr -> [Type] -> VM CoreExpr
60 dicts <- mapM paDictOfType tys
61 return $ mkApps (mkTyApps dfun tys) dicts