[trac@galois.com: Re: [GHC] #1218: Add sortNub and sortNubBy to Data.List]

Donald Bruce Stewart dons at cse.unsw.edu.au
Sun Mar 18 20:02:51 EDT 2007


I propose we *do not* change the api to add the special case:

    sortNub = sort . nub
            = map head . group . sort

and instead add a rewrite rule to Data.List to provide this
optimisation.

 {-# RULES
 "sort/nub" sort . nub = map head . group . sort
   #-}

Along with a QuickCheck property to test it:

 prop_sortnub xs = sort (nub xs) == map head (group (sort xs))

-- Don

----- Forwarded message from GHC <trac at galois.com> -----

Date: Sun, 18 Mar 2007 23:51:50 -0000
From: GHC <trac at galois.com>
To: glasgow-haskell-bugs at haskell.org
Subject: Re: [GHC] #1218: Add sortNub and sortNubBy to Data.List

#1218: Add sortNub and sortNubBy to Data.List
----------------------------+-----------------------------------------------
 Reporter:  neil            |          Owner:         
     Type:  proposal        |         Status:  new    
 Priority:  normal          |      Milestone:  Not GHC
Component:  libraries/base  |        Version:         
 Severity:  normal          |     Resolution:         
 Keywords:                  |     Difficulty:  Unknown
 Testcase:                  |   Architecture:  Unknown
       Os:  Unknown         |  
----------------------------+-----------------------------------------------
Comment (by dons):

 How about rather than changing the api, purely for efficiency reasons, we
 just add a rewrite rule to Data.List for this optimisation?

 The rule would be:

 {{{
 {-# RULES
 "sort/nub" sort . nub = map head . group . sort
   #-}
 }}}

 sort . nub will be rewritten to the optimised case, and we won't need to
 further complicate the API.

 Quite often now it is possible for the library author to expose only a
 small, generic API, while providing internal rules for specific optimised
 cases. This keeps the interface small, while still providing performance.

 Data.ByteString does this in a number of places, for example:

 {{{
 {-# RULES
   "FPS specialise filter (== x)" forall x.
      filter (== x) = filterByte x
   #-}
 }}}

 I'd really not like to see more functions exposed in the list interface,
 only as optimisations, that could be better provided via RULES.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/1218>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs at haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs


----- End forwarded message -----


More information about the Libraries mailing list