- p = /\ [a,b] -> \ [d1,d2] -> letrec DBINDS and BIND
- in (fm,gm)
-
-\begin{code}
--- We keep the invariant that a MonoBinds is only empty
--- if it is exactly EmptyMonoBinds
-
-nullMonoBinds :: MonoBinds id pat -> Bool
-nullMonoBinds EmptyMonoBinds = True
-nullMonoBinds other_monobind = False
-
-andMonoBinds :: MonoBinds id pat -> MonoBinds id pat -> MonoBinds id pat
-andMonoBinds EmptyMonoBinds mb = mb
-andMonoBinds mb EmptyMonoBinds = mb
-andMonoBinds mb1 mb2 = AndMonoBinds mb1 mb2
-
-andMonoBindList :: [MonoBinds id pat] -> MonoBinds id pat
-andMonoBindList binds
- = loop1 binds
- where
- loop1 [] = EmptyMonoBinds
- loop1 (EmptyMonoBinds : binds) = loop1 binds
- loop1 (b:bs) = loop2 b bs
-
- -- acc is non-empty
- loop2 acc [] = acc
- loop2 acc (EmptyMonoBinds : bs) = loop2 acc bs
- loop2 acc (b:bs) = loop2 (acc `AndMonoBinds` b) bs
-\end{code}
-