X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Ftypes%2FTypeRep.lhs;h=aa1f941bc00f21b96ea59a6a5b46cd2f4d2dfe7e;hp=819a71ce575c40491a8d74ba5967638c091afcf4;hb=34c8d0312071f7d0f4d221a997d3408c653ef9e5;hpb=f278f0676579f67075033a4f9857715909c4b71e diff --git a/compiler/types/TypeRep.lhs b/compiler/types/TypeRep.lhs index 819a71c..aa1f941 100644 --- a/compiler/types/TypeRep.lhs +++ b/compiler/types/TypeRep.lhs @@ -449,12 +449,23 @@ pprClassPred :: Class -> [Type] -> SDoc pprClassPred clas tys = ppr_type_app TopPrec (getName clas) tys pprTheta :: ThetaType -> SDoc -pprTheta theta = parens (sep (punctuate comma (map pprPred theta))) +-- pprTheta [pred] = pprPred pred -- I'm in two minds about this +pprTheta theta = parens (sep (punctuate comma (map pprPred theta))) pprThetaArrow :: ThetaType -> SDoc -pprThetaArrow theta - | null theta = empty - | otherwise = parens (sep (punctuate comma (map pprPred theta))) <+> ptext (sLit "=>") +pprThetaArrow [] = empty +pprThetaArrow [pred] + | noParenPred pred = pprPred pred <+> darrow +pprThetaArrow preds = parens (sep (punctuate comma (map pprPred preds))) <+> darrow + +noParenPred :: PredType -> Bool +-- A predicate that can appear without parens before a "=>" +-- C a => a -> a +-- a~b => a -> b +-- But (?x::Int) => Int -> Int +noParenPred (ClassP {}) = True +noParenPred (EqPred {}) = True +noParenPred (IParam {}) = False ------------------ instance Outputable Type where @@ -492,8 +503,11 @@ ppr_type p (FunTy ty1 ty2) maybeParen p FunPrec $ sep (ppr_type FunPrec ty1 : ppr_fun_tail ty2) where - ppr_fun_tail (FunTy ty1 ty2) = (arrow <+> ppr_type FunPrec ty1) : ppr_fun_tail ty2 - ppr_fun_tail other_ty = [arrow <+> pprType other_ty] + ppr_fun_tail (FunTy ty1 ty2) + | not (is_pred ty1) = (arrow <+> ppr_type FunPrec ty1) : ppr_fun_tail ty2 + ppr_fun_tail other_ty = [arrow <+> pprType other_ty] + is_pred (PredTy {}) = True + is_pred _ = False ppr_forall_type :: Prec -> Type -> SDoc ppr_forall_type p ty @@ -529,6 +543,8 @@ ppr_tc_app _ tc [ty] | tc `hasKey` argTypeKindTyConKey = ptext (sLit "??") ppr_tc_app p tc tys + | [ecvar,ty] <- tys, tc `hasKey` hetMetCodeTypeTyConKey + = ptext (sLit "<[") <> pprType ty <> ptext (sLit "]>@") <> ppr ecvar | isTupleTyCon tc && tyConArity tc == length tys = tupleParens (tupleTyConBoxity tc) (sep (punctuate comma (map pprType tys))) | otherwise @@ -570,7 +586,7 @@ pprTvBndr tv | isLiftedTypeKind kind = ppr tv Note [Infix type variables] ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In Haskell 98 you can say +With TypeOperators you can say f :: (a ~> b) -> b