+buildPADict :: Var -> TyCon -> TyCon -> VM [(Var, CoreExpr)]
+buildPADict var vect_tc arr_tc
+ = localV . abstractOverTyVars (tyConTyVars arr_tc) $ \abstract ->
+ do
+ meth_binds <- mapM (mk_method abstract) paMethods
+ let meth_vars = map (Var . fst) meth_binds
+ meth_exprs <- mapM (`applyToTypes` arg_tys) meth_vars
+
+ pa_dc <- builtin paDictDataCon
+ let dict = mkConApp pa_dc (Type (mkTyConApp vect_tc arg_tys) : meth_exprs)
+ return $ (var, dict) : meth_binds
+ where
+ tvs = tyConTyVars arr_tc
+ arg_tys = mkTyVarTys tvs
+
+ mk_method abstract (name, build)
+ = localV
+ $ do
+ body <- liftM abstract $ build vect_tc arr_tc
+ var <- newLocalVar name (exprType body)
+ return (var, mkInlineMe body)
+
+paMethods = [(FSLIT("lengthPA"), buildLengthPA),
+ (FSLIT("replicatePA"), buildReplicatePA)]
+
+buildLengthPA :: TyCon -> TyCon -> VM CoreExpr
+buildLengthPA _ arr_tc