[Haskell-cafe] Odd list comprehension behaviour

Manuel Gómez targen at gmail.com
Fri Mar 18 23:30:37 UTC 2016

On Thu, Mar 17, 2016 at 6:47 PM, Richard A. O'Keefe <ok at cs.otago.ac.nz> wrote:
> Let me rephrase that.  To me, that "if it does actually get to c" bit is
> NOT a consequence of my understanding of the general rules for
> enumeration in Haskell, they are a complicating ADDITION to those rules
> just for a case that I would be very upset to see happening in code of mine.

Indeed!  I agree completely that this is not consistent with the
current rules in Haskell, and I agree completely that this is a
complicating addition to those rules that is in no way derived from
the way things currently work or from some clear greater principle.

> I mean, this is an *extremely* special case.  [1.0,1.0..x] :: [Double
> is an infinite list for ALL x >= 1.0 in Haskell; you want to change this
> to be [1.0] if x happens to be the very special case 1.0, and I do
> not understand why.  Why is [1.0,1.0..1.0+epsilon] being infinite,
> [1.0,1.0,..1.0-epsilon] being empty, but [1.0,1.0..1.0] having one
> element USEFUL?  (And while you are at it, explain your reasoning
> for [x,x..negate x] when x is 0.0.)

To be clear: I’m not proposing this, I’m just exploring how such a
rule may be specified.  Although my current intuition agrees with the
original post’s stated intuition in that I was surprised to find
[1,1..1] is not finite, I personally don’t think it’s necessarily
better to have an intuitive rule: I generally favor rules that are
simple to state and reason about, rather than rules that produce
superficially intuitive results at the expense of special cases and
conceptual complexity — and I certainly hope saying that does not
derail this conversation into other recent discussions with similar
tradeoffs. ;-)

If I were to propose this, which I’m not, I would discuss what the
[a,b..c] notation is meant to represent.  To me, personally and for no
good reason, it looks like an iterator that yields numbers starting at
a, adding (b-a) at each step and yielding the next number as long as
it’s less than or equal to c, and continuing as long as c is neither
reached nor exceeded.  I make no claim on the universality of this
interpretation or the naturality of its deduction as a result of some
prior notational intuition, and I likewise make no claim about the
adequacy of this intuition as the foundation for the rules in Haskell.

In any case, I would personally never find it reasonable for a
proposal to suggest changing the rules Haskell uses to assign meaning
to this notation, unless there was very wide community consensus and
interest in such a change, which I find doubtful as it’s such a minor
detail.  I would prefer to see this turn into, say, a very short note
in the documentation pointing out this curiosity that may be
inconsistent with the intuitive expectations of some of us.

>> [6,6..6] would have the initial 6, and then it should have no other
>> element beyond 6, so it should in fact equal [6] under this intuition.
> But [6,6,6,6,6,6,6,6,6,6,6....] ALSO has no other element beyond 6.
> "Not going beyond 6" is one thing, "stopping exactly at 6" is another.

I misspoke again, indeed!  I should have said «it should have no other
element beyond the first 6».  Note I also purposely avoided cases with
b < a and c < a, as those confuse me even further, and I have no
opinion or solid intuition about them.

More information about the Haskell-Cafe mailing list