Need some understanding on this behavior.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Need some understanding on this behavior.

Alexander Chen

hi,

I need some understanding on the following behavior:

a = [1..]
[x | x <-a, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100

(note the missing ']' which results in the command not finishing)

b = take 1000 a
[x | x <-b, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]

Note, I took more for b  just for ease sake. But now the command finishes correctly.


Question:
why can i not use a lazy list directly in a list comprehension?

best,





_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Need some understanding on this behavior.

Alexander Klink
Hi Alexander,

On Mon, Feb 03, 2020 at 09:14:24AM +0100, Alexander Chen wrote:
> I need some understanding on the following behavior:
>
> a = [1..]
> [x | x <-a, x <= 100]
> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
>
> (note the missing ']' which results in the command not finishing)

It does not finish because the list comprehension does not know that a
is ordered, so it has to go through *every* element and take those that
are less than or equal to 100.

HTH,
Alex
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Need some understanding on this behavior.

David McBride
In reply to this post by Alexander Chen
You can absolutely use a lazy list in a list comprehension.  What you cannot do is evaluate an infinitely long list.

When you evaluate it so that it will be printed you are saying, print the *entire* list.  You may know that this list will never contain an element over 100, but as far as haskell is concerned, there could be an element after 100 and it will keep crunching to find it, by incrementing x and testing it against x <= 100 forever, even though it will never succeed.

On Mon, Feb 3, 2020 at 3:14 AM Alexander Chen <[hidden email]> wrote:

hi,

I need some understanding on the following behavior:

a = [1..]
[x | x <-a, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100

(note the missing ']' which results in the command not finishing)

b = take 1000 a
[x | x <-b, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]

Note, I took more for b  just for ease sake. But now the command finishes correctly.


Question:
why can i not use a lazy list directly in a list comprehension?

best,




_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Need some understanding on this behavior.

Alexander Chen
Hi,

thank you for the explanation. I know now how not to use it but for deeper understanding.

question:
Can a lazy list be ordered or is that just not possible? And how can you create a lazy list like this [1..] without there being any implicit order in it?

I don't want to be nitt-picking, i am trying to reconcile this paradox for deeper understanding.

thank you.

best,
  

February 4, 2020 2:44:27 PM CET David McBride <[hidden email]> wrote:">
You can absolutely use a lazy list in a list comprehension.  What you cannot do is evaluate an infinitely long list.

When you evaluate it so that it will be printed you are saying, print the *entire* list.  You may know that this list will never contain an element over 100, but as far as haskell is concerned, there could be an element after 100 and it will keep crunching to find it, by incrementing x and testing it against x <= 100 forever, even though it will never succeed.

On Mon, Feb 3, 2020 at 3:14 AM Alexander Chen <[hidden email]> wrote:

hi,

I need some understanding on the following behavior:

a = [1..]
[x | x <-a, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100

(note the missing ']' which results in the command not finishing)

b = take 1000 a
[x | x <-b, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]

Note, I took more for b  just for ease sake. But now the command finishes correctly.


Question:
why can i not use a lazy list directly in a list comprehension?

best,




_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners




_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Need some understanding on this behavior.

Ut Primum
Hi,

You can't sort an infinite list. It is easy to see this because you can't even decide what the first element of the ordered list should be, without checking all the list elements. Since they are infinite, you can't do that. 

Best,
Ut

Il mar 4 feb 2020, 15:00 Alexander Chen <[hidden email]> ha scritto:
Hi,

thank you for the explanation. I know now how not to use it but for deeper understanding.

question:
Can a lazy list be ordered or is that just not possible? And how can you create a lazy list like this [1..] without there being any implicit order in it?

I don't want to be nitt-picking, i am trying to reconcile this paradox for deeper understanding.

thank you.

best,
  

February 4, 2020 2:44:27 PM CET David McBride <[hidden email]> wrote:
You can absolutely use a lazy list in a list comprehension.  What you cannot do is evaluate an infinitely long list.

When you evaluate it so that it will be printed you are saying, print the *entire* list.  You may know that this list will never contain an element over 100, but as far as haskell is concerned, there could be an element after 100 and it will keep crunching to find it, by incrementing x and testing it against x <= 100 forever, even though it will never succeed.

On Mon, Feb 3, 2020 at 3:14 AM Alexander Chen <[hidden email]> wrote:

hi,

I need some understanding on the following behavior:

a = [1..]
[x | x <-a, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100

(note the missing ']' which results in the command not finishing)

b = take 1000 a
[x | x <-b, x <= 100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]

Note, I took more for b  just for ease sake. But now the command finishes correctly.


Question:
why can i not use a lazy list directly in a list comprehension?

best,




_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Need some understanding on this behavior.

Daniel Trstenjak-2
In reply to this post by Alexander Chen
Hi Alexander,

> And how can you create a lazy list like this [1..] without there being
> any implicit order in it?

to be able to know that the list [1..] is sorted, you would have to
encode this information into the list type and very user of the
list - like the list comprehension - would have to check this information.

At the end sorting just isn't a property of the list type.

Greetings,
Daniel
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners