@@ -166,33 +166,44 @@ instance (Pretty a, Pretty b) => Pretty (Constraint a b) where
166166 CEqual a b -> pretty a <+> P.text "=" <+> pretty b
167167 CAnd [] -> P.text "True"
168168
169− CAnd (c:cs) ->
170− P.parens . P.sep $ pretty c : (map (\c -> P.text "and" <+> pretty c) cs)
169+ CAnd cs ->
170+ P.parens . P.sep $ P.punctuate (P.text " and") (map pretty cs)
171171
172172 CLet [Scheme [] fqs constraint header] CTrue | Map.null header ->
173− P.hang binder 2 (pretty constraint)
173+ P.sep [ binder, pretty c ]
174174 where
175− binder = if null fqs then P.empty else
176− P.text "exists" <+> P.hsep (map pretty fqs) <> P.text "."
175+ mergeExists vs c =
176+ case c of
177+ CLet [Scheme [] fqs' c' _] CTrue -> mergeExists (vs ++ fqs') c'
178+ _ -> (vs, c)
179+
180+ (fqs', c) = mergeExists fqs constraint
181+
182+ binder = if null fqs' then P.empty else
183+ P.text "exists" <+> P.hsep (map pretty fqs') <> P.text "."
177184
178185 CLet schemes constraint ->
179− P.vcat [ P.hang (P.text "let") 4 (P.brackets . P.sep . P.punctuate P.comma $ map pretty schemes)
180− , P.text "in " <+> pretty constraint ]
186+ P.fsep [ P.hang (P.text "let") 4 (P.brackets . P.sep . P.punctuate P.comma $ map pretty schemes)
187+ , P.text "in", pretty constraint ]
181188
182189 CInstance name tipe ->
183190 P.text name <+> P.text "<" <+> pretty tipe
184191
185192instance (Pretty a, Pretty b) => Pretty (Scheme a b) where
186193 pretty (Scheme rqs fqs constraint headers) =
187− P.sep [ forall <+> frees <+> rigids, cs, headers' ]
194+ P.sep [ forall, cs, headers' ]
188195 where
189− forall = if Map.size headers + length rqs /= 0 then P.text "forall" else P.empty
196+ forall = if null rqs && null fqs then P.empty else
197+ P.text "forall" <+> frees <+> rigids
198+
190199 frees = P.hsep $ map pretty fqs
191− rigids = if length rqs > 0 then P.braces . P.hsep $ map pretty rqs else empty
200+ rigids = if null rqs then P.empty else P.braces . P.hsep $ map pretty rqs
201+
192202 cs = case constraint of
193203 CTrue -> P.empty
194204 CAnd [] -> P.empty
195205 _ -> P.brackets (pretty constraint)
206+
196207 headers' = if Map.size headers > 0 then dict else P.empty
197208 dict = P.parens . P.sep . P.punctuate P.comma . map prettyPair $ Map.toList headers
198209 prettyPair (n,t) = P.text n <+> P.text ":" <+> pretty t