<html><body style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size: 12px;"><div>If you actually evaulate [1,1..1] == [1..] in a GHCI prompt it will tell you False immediately. :)</div><div><br /></div><div>[1..] evaluates to  [1, 2, 3, 4, 5, 6, ... etc ...</div><div><br /></div><div>[1,1..1] evaluates to [1, 1, 1, 1, 1, 1 ... etc ...</div><div><br /></div><div>The syntax where you give 2 elements before the .. is intended to resemble this style of shorthand for lists: [1, 2, 3, 4, ...10]. The idea is that Haskell should take the two elements as "example elements" showing the pattern you want. So [1,1..] is saying you want a list that starts at 1, then has 1, and continues on like that; you're specifying a step size of *zero*, not of 1.</div><div><br /></div><div>You can step 1 by 0 an infinite number of times without exceeding 1, so [1,1..1] should not be finite.</div><div><br /></div><div>-- Ben<br /><blockquote><br />----- Original Message -----<br /><div style="width:100%;background:rgb(228,228,228);"><div style="font-weight:bold;">From:</div> "Krisztian Pinter" <pin.terminator@gmail.com></div><br /><div style="font-weight:bold;">To:</div><haskell-cafe@haskell.org><br /><div style="font-weight:bold;">Cc:</div><br /><div style="font-weight:bold;">Sent:</div>Thu, 17 Mar 2016 03:58:06 +0100<br /><div style="font-weight:bold;">Subject:</div>[Haskell-cafe] Odd list comprehension behaviour<br /><br /><br /><div dir="ltr">Hello,<div><br /></div><div>I noticed some odd behaviour with list comprehensions.</div><div><font face="monospace, monospace"><br /></font></div><div><font face="monospace, monospace">[1..1] == [1]</font></div><div>BUT</div><div><font face="monospace, monospace">[1,1..1] == [1..]</font></div><div><br /></div><div>I noticed this while writing a Clean program, but it seems Haskell inherited this as well.</div><div>In the case of integer lists with step size >= 0 the <font face="monospace, monospace">up_list</font> function[1] is used:<br /></div><div><br /></div><div><div><font face="monospace, monospace">up_list :: Integer -> Integer -> Integer -> [Integer]</font></div><div><font face="monospace, monospace">up_list x0 delta lim = go (x0 :: Integer)</font></div><div><font face="monospace, monospace">                    where</font></div><div><font face="monospace, monospace">                        go x | x > lim   = []</font></div><div><font face="monospace, monospace">                             | otherwise = x : go (x+delta)</font></div></div><div><br /></div><div>In the case of [1,1..1] x0 == lim, so <font face="monospace, monospace">go</font> will recurse infinitely, producing an infinite list.</div><div><br /></div><div>I think the reasonable behaviour would be <font face="monospace, monospace">[1,1..1] == [1]</font>. Is there a reason it doesn't work like this?</div><div><br /></div><div>[1] <a href="http://hackage.haskell.org/package/base-4.8.2.0/docs/src/GHC.Enum.html#up_list">http://hackage.haskell.org/package/base-4.8.2.0/docs/src/GHC.Enum.html#up_list</a></div><div><br /></div><div>Thanks,</div><div>Krisztián</div></div>

</blockquote></div></body></html>