Ticket 996: Add ranged sets

The ticket is at http://hackage.haskell.org/trac/ghc/ticket/996 Ranged sets represent sets of ordered values as lists of ranges. Each range has a lower and upper boundary, and for any value and boundary the value is either above or below the boundary: no value can ever sit on a boundary. There are also boundaries for +/- infinity (BoundaryBelowAll? http://hackage.haskell.org/trac/ghc/wiki/BoundaryBelowAll and BoundaryAboveAll? http://hackage.haskell.org/trac/ghc/wiki/BoundaryAboveAll). The upshot is that you can represent a set of reals such as [ 2.0 < x <= 3.4, 6.7 < x] or a couple of encyclopedia volumes as: ["a" <= x < "blob", "goo" <= x < "hun"] The usual set operators are provided. The library also does the Right Thing with adjacent values: [2 < x <= 3] Union [4 <= x < 5] == [2 < x < 5] [2.0 < x <= 3.0] Union [4.0 <= x < 5.0] == [2.0 < x <= 3.0, 4.0 <= x < 5.0] I've needed something like this more than once over the years, in various languages. Haskell is the first one that can actually do the Right Thing efficiently for a polymorphic type. The source contains Haddock comments and a comprehensive set of QuickCheck? http://hackage.haskell.org/trac/ghc/wiki/QuickCheck properties. I've integrated these into the documentation. So far I've tested this on GHC 6.4.1, although this patch is against the HEAD of the current libraries. If this patch is accepted I'll also add patches for ranged sets of times (e.g. the set of all times within the first Tuesday of each month), and to filter finite maps against ranged sets.

On Sat, Nov 11, 2006 at 10:59:41AM +0000, Paul Johnson wrote:
The ticket is at http://hackage.haskell.org/trac/ghc/ticket/996
Ranged sets represent sets of ordered values as lists of ranges. Each range has a lower and upper boundary, and for any value and boundary the value is either above or below the boundary: no value can ever sit on a boundary. There are also boundaries for +/- infinity
A few fairly superficial comments: (This would have been easier to read as a single patch.) This code could easily be made Haskell 98: - Data.Ranged.Boundaries includes an instance instance DiscreteOrdered Rational which would be better generalized to instance Integral a => DiscreteOrdered (Ratio a) - There are a few pattern type annotations, which could be removed: - in instance Arbitrary (Range v), superfluous - in QuickCheck properties, use signatures instead (It's also more common for QuickCheck properties to have separate arguments instead of tuple arguments) Data.Ranged.Ranges has -cpp, but this seems unused Since this is basically Haskell 98, and is cleanly separated from the modules of base, it looks like a prime candidate for a separate package, especially as the plan is to slim down base package (#710).
participants (2)
-
Paul Johnson
-
Ross Paterson