[GHC] #10858: Smaller generated Ord instances (was: Smaller generated instances)

GHC ghc-devs at haskell.org
Tue Sep 8 20:02:10 UTC 2015


#10858: Smaller generated Ord instances
-------------------------------------+-------------------------------------
        Reporter:  nomeata           |                   Owner:
            Type:  task              |                  Status:  new
        Priority:  normal            |               Milestone:
       Component:  Compiler          |                 Version:  7.10.2
      Resolution:                    |                Keywords:
Operating System:  Unknown/Multiple  |            Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:  #9557             |  Differential Revisions:
-------------------------------------+-------------------------------------
Changes (by nomeata):

 * keywords:  newcomer =>
 * related:   => #9557


Comment:

 Ah, so I had that feeling before. I guess it is a duplicate.. or maybe
 this ticket is now more specific to talk about Ord.

 Re note `Note [Do not rely on compare]`: Note that we actually do rely on
 `compare` for all but the last field. So either the note can be ignored
 (at least in the case of product types), or a similar chain, not using
 `compare` can be built for the other operators:
 {{{
     (<) 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
                    -> (<) a1_acXB b1_acXJ ||
                       (<) a2_acXC b2_acXK ||
                       (<) a3_acXD b3_acXL ||
                       (<) a4_acXE b4_acXM ||
                       (<) a5_acXF b5_acXN ||
                       (<) a6_acXG b6_acXO ||
                       (<) a7_acXH b7_acXP ||
                       (<) a8_acXI b8_acXQ
 }}}

 This follows the same pattern above, just using the right connective: It
 should be `||` for `(<)` and `(>)`, `&&` for `(<=)` and `(>=)` and
 `thenComp` for `compare`. And one should check that this is right-
 associative, to get the right lazy behavior.

 Still a nice ticket for new contributors.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10858#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list