[Haskell-beginners] Ranges and List Comprehensions in SQL

Brent Yorgey byorgey at seas.upenn.edu
Fri Sep 3 11:43:13 EDT 2010


On Fri, Sep 03, 2010 at 11:21:27AM -0400, Tom Murphy wrote:
> >
> > I am not sure I understand what you are asking.  Do you want something
> > like this?
> >
> >  data Range = Range Integer Integer
> >
> >  toRanges :: [Integer] -> [Range]
> >  toRanges = ...
> >
> > toRanges should not be too hard to write but nothing like that exists
> > as far as I know.
> >
> >
> 
> I don't quite understand the functionality of toRanges. When I say "range,"
> I mean a list containing an enumeration, in the form:
> 
> [2..300]

[2..300] is just syntactic sugar for the list
[2,3,4,5,6,7,8,9,......,300].  It isn't actually a real "thing" in
Haskell. That's why I made a new data type to represent it:

  data Range = Range Integer Integer

  toList (Range x y) = [x..y]

So for example (Range 2 300) represents the list [2..300].

> The record would actually be coming from an SQL database.
> I would like to be able to store a large list in SQL records, without having
> to store every element.

I see.  So the question seems more about database design than about
Haskell.  Toby has suggested a more relational way to model the data,
but his solution does end up storing every element.  But you could do
something more like

  CREATE TABLE tv_show (
        id INTEGER NOT NULL, -- etc
        title VARCHAR(80),
        PRIMARY KEY (id)
  );
  CREATE TABLE episode_ranges (
        tv_show_id INTEGER NOT NULL,
        start_episode INTEGER,
	end_episode INTEGER
        PRIMARY KEY (tv_show_id, start_episode)
  );

Or something like that (it's been a while since I've used SQL).  The
data would then be more like

  tv_show (30, "The Simpsons")
  episode_ranges (30,1,4), (30,14,14), (30,18,21), (30,23,25)

-Brent


  



More information about the Beginners mailing list