-- ==========================================================-- -- === Turn type expressions into domain expressions. ===-- -- === TExpr2DExpr.hs ===-- -- ==========================================================-- module TExpr2DExpr where import BaseDefs import Utils import MyUtils import DomainExpr import MakeDomains import TypeCheck5 import List(nub) -- 1.3 -- ==========================================================-- -- This may need fixing up if we start instantiating domain -- variables to expressions which contain other domain -- variables within them. -- 4 Feb: solved the above problem by replacing the offending -- domain variables with 2. -- 5 Feb: fixed to curry domains properly, if necessary. -- txGetInstantiations :: DExpr -> DExpr -> AList Naam Domain txGetInstantiations simplest usage = consistent [] (gi simplest usage) where gi (DXVar v) dexpr = [(v, dxApplyDSubst_2 dexpr)] gi DXTwo DXTwo = [] gi (DXLift1 dxs1) (DXLift1 dxs2) = concat (myZipWith2 gi dxs1 dxs2) gi (DXLift2 dxs1) (DXLift2 dxs2) = concat (myZipWith2 gi dxs1 dxs2) gi (DXFunc dxss1 dxt1) (DXFunc dxss2 dxt2) = let basis_arity = length dxss1 usage_arity = length dxss2 (new_dxss2, new_dxt2) = if usage_arity > basis_arity then (take basis_arity dxss2, DXFunc (drop basis_arity dxss2) dxt2) else (dxss2, dxt2) in gi dxt1 new_dxt2 ++ concat (myZipWith2 gi dxss1 new_dxss2) consistent acc [] = acc consistent acc ((v,dx):rest) = case utLookup acc v of Nothing -> consistent ((v,dx):acc) rest Just dy -> if dx == dy then consistent acc rest else panic "txGetInstantiations" -- ==========================================================-- -- tx2dxAnnTree :: TypeDependancy -> AnnExpr Naam TExpr -> AnnExpr Naam DExpr tx2dxAnnTree td tree = tcMapAnnExpr (tx2dx td) tree -- ==========================================================-- -- tx2dx :: TypeDependancy -> TExpr -> DExpr tx2dx td texpr = let typeVars = sort (nub (tcTvars_in texpr)) dVarEnv = zip typeVars [[x] | x <- "abcdefghijklmnopqrstuvwxyz"] in if length typeVars > 26 then panic "tx2dx" else dxNormaliseDExpr (tx2dx_aux td dVarEnv texpr) tx2dx_aux td env (TVar v) = DXVar (utSureLookup env "tx2dx_aux(1)" v) tx2dx_aux td env (TCons "int" []) = DXTwo tx2dx_aux td env (TCons "char" []) = DXTwo tx2dx_aux td env (TArr t1 t2) = DXFunc [tx2dx_aux td env t1] (tx2dx_aux td env t2) tx2dx_aux td env (TCons tname targs) = if mdIsRecursiveType td tname then DXLift2 (map (tx2dx_aux td env) targs) else DXLift1 (map (tx2dx_aux td env) targs) -- ==========================================================-- -- === end TExpr2DExpr.hs ===-- -- ==========================================================--