diff options
| -rw-r--r-- | compiler/typecheck/TcGenGenerics.hs | 46 | 
1 files changed, 18 insertions, 28 deletions
diff --git a/compiler/typecheck/TcGenGenerics.hs b/compiler/typecheck/TcGenGenerics.hs index 087bd938f0..2f068343fb 100644 --- a/compiler/typecheck/TcGenGenerics.hs +++ b/compiler/typecheck/TcGenGenerics.hs @@ -577,17 +577,15 @@ tc_mkRepTy gk_ tycon k =          mkS mlbl su ss ib a = mkTyConApp s1 [k, metaSelTy mlbl su ss ib, a]          -- Sums and products are done in the same way for both Rep and Rep1 -        sumP [] = mkTyConApp v1 [k] -        sumP l  = foldBal mkSum' . map mkC  $ l +        sumP l = foldBal mkSum' (mkTyConApp v1 [k]) . map mkC $ l          -- The Bool is True if this constructor has labelled fields          prod :: [Type] -> [HsSrcBang] -> [HsImplBang] -> [FieldLabel] -> Type -        prod [] _  _  _  = mkTyConApp u1 [k] -        prod l  sb ib fl = foldBal mkProd -                                   [ ASSERT(null fl || lengthExceeds fl j) -                                     arg t sb' ib' (if null fl -                                                       then Nothing -                                                       else Just (fl !! j)) -                                   | (t,sb',ib',j) <- zip4 l sb ib [0..] ] +        prod l sb ib fl = foldBal mkProd (mkTyConApp u1 [k]) +                                  [ ASSERT(null fl || lengthExceeds fl j) +                                    arg t sb' ib' (if null fl +                                                      then Nothing +                                                      else Just (fl !! j)) +                                  | (t,sb',ib',j) <- zip4 l sb ib [0..] ]          arg :: Type -> HsSrcBang -> HsImplBang -> Maybe FieldLabel -> Type          arg t (HsSrcBang _ su ss) ib fl = mkS fl su ss ib $ case gk_ of @@ -739,14 +737,13 @@ mk1Sum gk_ us i n datacon = (from_alt, to_alt)      datacon_varTys = zip (map mkGenericLocal [us .. us+n_args-1]) argTys      datacon_vars = map fst datacon_varTys -    us'          = us + n_args      datacon_rdr  = getRdrName datacon      from_alt     = (nlConVarPat datacon_rdr datacon_vars, from_alt_rhs) -    from_alt_rhs = genLR_E i n (mkProd_E gk_ us' datacon_varTys) +    from_alt_rhs = genLR_E i n (mkProd_E gk_ datacon_varTys) -    to_alt     = ( genLR_P i n (mkProd_P gk us' datacon_varTys) +    to_alt     = ( genLR_P i n (mkProd_P gk datacon_varTys)                   , to_alt_rhs                   ) -- These M1s are meta-information for the datatype      to_alt_rhs = case gk_ of @@ -788,13 +785,11 @@ genLR_E i n e  -- Build a product expression  mkProd_E :: GenericKind_DC    -- Generic or Generic1? -         -> US                -- Base for unique names           -> [(RdrName, Type)]                         -- List of variables matched on the lhs and their types           -> LHsExpr GhcPs   -- Resulting product expression -mkProd_E _   _ []     = mkM1_E (nlHsVar u1DataCon_RDR) -mkProd_E gk_ _ varTys = mkM1_E (foldBal prod appVars) -                     -- These M1s are meta-information for the constructor +mkProd_E gk_ varTys = mkM1_E (foldBal prod (nlHsVar u1DataCon_RDR) appVars) +                      -- These M1s are meta-information for the constructor    where      appVars = map (wrapArg_E gk_) varTys      prod a b = prodDataCon_RDR `nlHsApps` [a,b] @@ -833,12 +828,10 @@ unboxedRepRDRs ty  -- Build a product pattern  mkProd_P :: GenericKind       -- Gen0 or Gen1 -         -> US                -- Base for unique names           -> [(RdrName, Type)] -- List of variables to match,                                --   along with their types           -> LPat GhcPs      -- Resulting product pattern -mkProd_P _  _ []     = mkM1_P (nlNullaryConPat u1DataCon_RDR) -mkProd_P gk _ varTys = mkM1_P (foldBal prod appVars) +mkProd_P gk varTys = mkM1_P (foldBal prod (nlNullaryConPat u1DataCon_RDR) appVars)                       -- These M1s are meta-information for the constructor    where      appVars = unzipWith (wrapArg_P gk) varTys @@ -870,15 +863,12 @@ mkM1_P p = nlParPat $ m1DataCon_RDR `nlConPat` [p]  nlHsCompose :: LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs  nlHsCompose x y = compose_RDR `nlHsApps` [x, y] --- | Variant of foldr1 for producing balanced lists -foldBal :: (a -> a -> a) -> [a] -> a -foldBal op = foldBal' op (error "foldBal: empty list") - -foldBal' :: (a -> a -> a) -> a -> [a] -> a -foldBal' _  x []  = x -foldBal' _  _ [y] = y -foldBal' op x l   = let (a,b) = splitAt (length l `div` 2) l -                    in foldBal' op x a `op` foldBal' op x b +-- | Variant of foldr for producing balanced lists +foldBal :: (a -> a -> a) -> a -> [a] -> a +foldBal _  x []  = x +foldBal _  _ [y] = y +foldBal op x l   = let (a,b) = splitAt (length l `div` 2) l +                   in foldBal op x a `op` foldBal op x b  {-  Note [Generics and unlifted types]  | 
