Darn, I sent this as personal mail the first time.

Evan Laforge wrote:
In Haskell,
"The sequence enumFromTo e1 e3 is the list [e1,e1+1,e1+2,...e3].
 The list is empty if e1 > e3."

I like it, since it means that things like [n .. n + length m - 1]
work as expected when m is [].  Or say 'map (array!) [bsearch x ..
bsearch y - 1]'.

Tangent:  Of course, I would prefer the range be half-open, which is a
pretty consistent standard in the rest of the world.  I've had a
number of off by one errors from this, and from Array.bounds.  I guess
it's too late to fix those, though, even if there were agreement that
they need to be fixed.

It causes problems with types that have an upper bound.  You can't
express Haskell's [False .. True] as a half-open range for example.

---

One solution would be a new syntax for half-open ranges distinct from
that for closed ranges, or maybe a couple of operators.  Sketching
without a compiler:

lo <. hi = takeWhile (< hi) [lo ..]

data EnumStart a = a :& a

(lo :& mid) <: hi = takeWhile (< hi) [lo, mid ..]

So you can do things like (0 <. 10) or (0 :& 2 <: 10)

Or one could use the same operator for both, if one defined something like:

class OpenEnum bot top where
  (<.) :: bot -> top -> [top]
instance (Enum e) => OpenEnum e e where
  lo <. hi = takeWhile (< hi) [lo ..]
instance (Enum e) => OpenEnum (EnumStart a) a ...
  (lo :& mid) <. hi = takeWhile (< hi) [lo, mid ..]

A better choice of line noise for the operator could still be made though.

--
src/
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to