@@ -166,33 +166,44 @@ instance (Pretty a, Pretty b) => Pretty (Constraint a b) where
166 CEqual a b -> pretty a <+> P.text "=" <+> pretty b
166 CEqual a b -> pretty a <+> P.text "=" <+> pretty b
167 CAnd [] -> P.text "True"
167 CAnd [] -> P.text "True"
169− CAnd (c:cs) ->
169+ CAnd cs ->
170− P.parens . P.sep $ pretty c : (map (\c -> P.text "and" <+> pretty c) cs)
170+ P.parens . P.sep $ P.punctuate (P.text " and") (map pretty cs)
172 CLet [Scheme [] fqs constraint header] CTrue | Map.null header ->
172 CLet [Scheme [] fqs constraint header] CTrue | Map.null header ->
173− P.hang binder 2 (pretty constraint)
173+ P.sep [ binder, pretty c ]
177+ CLet [Scheme [] fqs' c' _] CTrue -> mergeExists (vs ++ fqs') c'
180+ (fqs', c) = mergeExists fqs constraint
175− binder = if null fqs then P.empty else
182+ binder = if null fqs' then P.empty else
176− P.text "exists" <+> P.hsep (map pretty fqs) <> P.text "."
183+ P.text "exists" <+> P.hsep (map pretty fqs') <> P.text "."
178 CLet schemes constraint ->
185 CLet schemes constraint ->
179− P.vcat [ P.hang (P.text "let") 4 (P.brackets . P.sep . P.punctuate P.comma $ map pretty schemes)
186+ P.fsep [ P.hang (P.text "let") 4 (P.brackets . P.sep . P.punctuate P.comma $ map pretty schemes)
180− , P.text "in " <+> pretty constraint ]
187+ , P.text "in", pretty constraint ]
182 CInstance name tipe ->
189 CInstance name tipe ->
183 P.text name <+> P.text "<" <+> pretty tipe
190 P.text name <+> P.text "<" <+> pretty tipe
185instance (Pretty a, Pretty b) => Pretty (Scheme a b) where
192instance (Pretty a, Pretty b) => Pretty (Scheme a b) where
186 pretty (Scheme rqs fqs constraint headers) =
193 pretty (Scheme rqs fqs constraint headers) =
187− P.sep [ forall <+> frees <+> rigids, cs, headers' ]
194+ P.sep [ forall, cs, headers' ]
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
190 frees = P.hsep $ map pretty fqs
199 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
192 cs = case constraint of
202 cs = case constraint of
193 CTrue -> P.empty
203 CTrue -> P.empty
194 CAnd [] -> P.empty
204 CAnd [] -> P.empty
195 _ -> P.brackets (pretty constraint)
205 _ -> P.brackets (pretty constraint)
196 headers' = if Map.size headers > 0 then dict else P.empty
207 headers' = if Map.size headers > 0 then dict else P.empty
197 dict = P.parens . P.sep . P.punctuate P.comma . map prettyPair $ Map.toList headers
208 dict = P.parens . P.sep . P.punctuate P.comma . map prettyPair $ Map.toList headers
198 prettyPair (n,t) = P.text n <+> P.text ":" <+> pretty t
209 prettyPair (n,t) = P.text n <+> P.text ":" <+> pretty t