on master help sign in
Simplify code to generate record constraints
576e979Evan Czaplicki
compiler/SourceSyntax/Type.hs+1−1
@@ -16,7 +16,7 @@ data Type = Lambda Type Type
16 | Record [(String,Type)] Type
16 | Record [(String,Type)] Type
17 deriving (Eq, Show, Data, Typeable)
17 deriving (Eq, Show, Data, Typeable)
18
18
19−fieldMap :: [(String,Type)] -> Map.Map String [Type]
19+fieldMap :: [(String,a)] -> Map.Map String [a]
20fieldMap fields =
20fieldMap fields =
21 foldl (\r (x,t) -> Map.insertWith (++) x [t] r) Map.empty fields
21 foldl (\r (x,t) -> Map.insertWith (++) x [t] r) Map.empty fields
22
22
compiler/Type/Constrain/Expression.hs+15−22
@@ -108,31 +108,24 @@ constrain env (L _ _ expr) tipe =
108
108
109 Modify e fields ->
109 Modify e fields ->
110 exists $ \t -> do
110 exists $ \t -> do
111− dummyFields <- Map.fromList <$> mapM dummyField fields
111+ oldVars <- forM fields $ \_ -> var Flexible
112+ let oldFields = SrcT.fieldMap (zip (map fst fields) (map VarN oldVars))
112− cOld <- constrain env e (record dummyFields t)
113+ cOld <- ex oldVars <$> constrain env e (record oldFields t)
113− (fieldTypes, constraints) <- unzip <$> mapM field fields
114+
115+ newVars <- forM fields $ \_ -> var Flexible
116+ let newFields = SrcT.fieldMap (zip (map fst fields) (map VarN newVars))
114− let cNew = tipe === record (Map.fromList fieldTypes) t
117+ let cNew = tipe === record newFields t
115− return (CAnd (cOld : cNew : constraints))
116− where
117− dummyField (label, _) = do
118− v <- var Flexible -- needs an ex
119− return (label, [VarN v])
120
118
121− field (label, value) = do
122− v <- var Flexible -- needs an ex
123− c <- ex [v] <$> constrain env value (VarN v)
119+ cs <- zipWithM (constrain env) (map snd fields) (map VarN newVars)
124− return ((label, [VarN v]), c)
120+
121+ return $ cOld /\ ex newVars (CAnd (cNew : cs))
125
122
126 Record fields ->
123 Record fields ->
127− do (pairs, cs) <- unzip <$> mapM field fields
124+ do vars <- forM fields $ \_ -> var Flexible
128− let fieldTypes = Map.fromList (map (second (\t -> [VarN t])) pairs)
125+ cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
126+ let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
129− recordType = record fieldTypes (TermN EmptyRecord1)
127+ recordType = record fields' (TermN EmptyRecord1)
130− return $ ex (map snd pairs) (CAnd (tipe === recordType : cs))
128+ return . ex vars $ CAnd (tipe === recordType : cs)
131− where
132− field (name, body) = do
133− v <- var Flexible -- needs an ex
134− c <- constrain env body (VarN v)
135− return ((name, v), c)
136
129
137 Markdown _ ->
130 Markdown _ ->
138 return $ tipe === Env.get env Env.types "Element"
131 return $ tipe === Env.get env Env.types "Element"
compiler/Type/Type.hs+1
@@ -25,6 +25,7 @@ data TermN a
25 | TermN (Term1 (TermN a))
25 | TermN (Term1 (TermN a))
26 deriving Show
26 deriving Show
27
27
28+record :: Map.Map String [TermN a] -> TermN a -> TermN a
28record fs rec = TermN (Record1 fs rec)
29record fs rec = TermN (Record1 fs rec)
29
30
30type Type = TermN Variable
31type Type = TermN Variable