
#10858: Smaller generated instances -------------------------------------+------------------------------------- Reporter: nomeata | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.2 Resolution: | Keywords: newcomer Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Changes (by nomeata): * keywords: => newcomer Comment: Consider this code generated for `Ord` for a product type: {{{ instance Ord l_acv3 => Ord (ImportDecl l_acv3) where compare a_acXz b_acXA = case a_acXz of { ImportDecl a1_acXB a2_acXC a3_acXD a4_acXE a5_acXF a6_acXG a7_acXH a8_acXI -> case b_acXA of { ImportDecl b1_acXJ b2_acXK b3_acXL b4_acXM b5_acXN b6_acXO b7_acXP b8_acXQ -> case (compare a1_acXB b1_acXJ) of { LT -> LT EQ -> case (compare a2_acXC b2_acXK) of { LT -> LT EQ -> case (compare a3_acXD b3_acXL) of { LT -> LT EQ -> case (compare a4_acXE b4_acXM) of { LT -> LT EQ -> case (compare a5_acXF b5_acXN) of { LT -> LT EQ -> case (compare a6_acXG b6_acXO) of { LT -> LT EQ -> case (compare a7_acXH b7_acXP) of { LT -> LT EQ -> (a8_acXI `compare` b8_acXQ) GT -> GT } GT -> GT } GT -> GT } GT -> GT } GT -> GT } GT -> GT } GT -> GT } } } (<) a_acXR b_acXS = case a_acXR of { ImportDecl a1_acXT a2_acXU a3_acXV a4_acXW a5_acXX a6_acXY a7_acXZ a8_acY0 -> case b_acXS of { ImportDecl b1_acY1 b2_acY2 b3_acY3 b4_acY4 b5_acY5 b6_acY6 b7_acY7 b8_acY8 -> case (compare a1_acXT b1_acY1) of { LT -> True EQ -> case (compare a2_acXU b2_acY2) of { LT -> True EQ -> case (compare a3_acXV b3_acY3) of { LT -> True EQ -> case (compare a4_acXW b4_acY4) of { LT -> True EQ -> case (compare a5_acXX b5_acY5) of { LT -> True EQ -> case (compare a6_acXY b6_acY6) of { LT -> True EQ -> case (compare a7_acXZ b7_acY7) of { LT -> True EQ -> (a8_acY0 < b8_acY8) GT -> False } GT -> False } GT -> False } GT -> False } GT -> False } GT -> False } GT -> False } } } (<=) a_acY9 b_acYa = case a_acY9 of { ImportDecl a1_acYb a2_acYc a3_acYd a4_acYe a5_acYf a6_acYg a7_acYh a8_acYi -> case b_acYa of { ImportDecl b1_acYj b2_acYk b3_acYl b4_acYm b5_acYn b6_acYo b7_acYp b8_acYq -> case (compare a1_acYb b1_acYj) of { LT -> True EQ -> case (compare a2_acYc b2_acYk) of { LT -> True EQ -> case (compare a3_acYd b3_acYl) of { LT -> True EQ -> case (compare a4_acYe b4_acYm) of { LT -> True EQ -> case (compare a5_acYf b5_acYn) of { LT -> True EQ -> case (compare a6_acYg b6_acYo) of { LT -> True EQ -> case (compare a7_acYh b7_acYp) of { LT -> True EQ -> (a8_acYi <= b8_acYq) GT -> False } GT -> False } GT -> False } GT -> False } GT -> False } GT -> False } GT -> False } } } (>=) a_acYr b_acYs = case a_acYr of { ImportDecl a1_acYt a2_acYu a3_acYv a4_acYw a5_acYx a6_acYy a7_acYz a8_acYA -> case b_acYs of { ImportDecl b1_acYB b2_acYC b3_acYD b4_acYE b5_acYF b6_acYG b7_acYH b8_acYI -> case (compare a1_acYt b1_acYB) of { LT -> False EQ -> case (compare a2_acYu b2_acYC) of { LT -> False EQ -> case (compare a3_acYv b3_acYD) of { LT -> False EQ -> case (compare a4_acYw b4_acYE) of { LT -> False EQ -> case (compare a5_acYx b5_acYF) of { LT -> False EQ -> case (compare a6_acYy b6_acYG) of { LT -> False EQ -> case (compare a7_acYz b7_acYH) of { LT -> False EQ -> (a8_acYA >= b8_acYI) GT -> True } GT -> True } GT -> True } GT -> True } GT -> True } GT -> True } GT -> True } } } (>) a_acYJ b_acYK = case a_acYJ of { ImportDecl a1_acYL a2_acYM a3_acYN a4_acYO a5_acYP a6_acYQ a7_acYR a8_acYS -> case b_acYK of { ImportDecl b1_acYT b2_acYU b3_acYV b4_acYW b5_acYX b6_acYY b7_acYZ b8_acZ0 -> case (compare a1_acYL b1_acYT) of { LT -> False EQ -> case (compare a2_acYM b2_acYU) of { LT -> False EQ -> case (compare a3_acYN b3_acYV) of { LT -> False EQ -> case (compare a4_acYO b4_acYW) of { LT -> False EQ -> case (compare a5_acYP b5_acYX) of { LT -> False EQ -> case (compare a6_acYQ b6_acYY) of { LT -> False EQ -> case (compare a7_acYR b7_acYZ) of { LT -> False EQ -> (a8_acYS > b8_acZ0) GT -> True } GT -> True } GT -> True } GT -> True } GT -> True } GT -> True } GT -> True } } } }}} This is huge! And so redundant. If the implementation of the operators `>` etc. build on the individual `compare` functions anyways, then it would surely be worth it to use the `compare` chain that was generated for the `compare` function – i.e. simply use the default instance. Also, for the compare function, maybe we should add a function {{{ thenCmp :: Ordering -> Ordering -> Ordering thenCmp EQ o2 = o2 thenCmp o1 _ = o1 }}} to `Data.Ord` and use that to simply this to {{{ instance Ord l_acv3 => Ord (ImportDecl l_acv3) where compare a_acXz b_acXA = case a_acXz of { ImportDecl a1_acXB a2_acXC a3_acXD a4_acXE a5_acXF a6_acXG a7_acXH a8_acXI -> case b_acXA of { ImportDecl b1_acXJ b2_acXK b3_acXL b4_acXM b5_acXN b6_acXO b7_acXP b8_acXQ -> compare a1_acXB b1_acXJ `thenComp` compare a2_acXC b2_acXK `thenComp` compare a3_acXD b3_acXL `thenComp` compare a4_acXE b4_acXM `thenComp` compare a5_acXF b5_acXN `thenComp` compare a6_acXG b6_acXO `thenComp` compare a7_acXH b7_acXP `thenComp` compare a8_acXI b8_acXQ }}} Maybe this is a nice newcomer ticket: Relatively local, rewarding, and easy to get right. This is `mkCompareFields` in `TcGenDeriv` Also look at the other deriving instances for refactoring possibilities! -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10858#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler