Haskell - Warum gibt dieses Listenverständnis eine unendliche Liste zurück?
[3 * x | x <- [1 ..], 3 * x < 20]
Ich verstehe nicht wirklich, warum das so ist
[3,6,9,12,15,18
Und findet kein Ende
Antworten
Die Semantik von
[3 * x | x <- [1 ..], 3 * x < 20]
ist es, alle Elemente von auszuprobieren [1..]
und diejenigen zu behalten, die die Filterbedingung erfüllen 3*x<20
.
Ein Mensch kann sehen, dass es nach dem ersten, x
der den Zustand verfälscht, keinen Sinn macht, alle größeren Werte zu versuchen, aber Haskell wird diese trotzdem versuchen und in einer Art Endlosschleife stecken bleiben.
Dies liegt daran, dass im allgemeinen Fall die Bedingung wieder wahr werden könnte, z
[3 * x | x <- [1 ..], 3 * x < 20 || x == 1000000 ]
Im Allgemeinen ist es unentscheidbar festzustellen, ob es keine weiteren Lösungen gibt. Daher kann sich Haskell wie jede andere Programmiersprache nicht dafür entscheiden, nach der letzten Lösung anzuhalten.
Wenn die Liste nach dem ersten Wert angehalten werden soll, der die Filterbedingung nicht erfüllt, verwenden Sie takeWhile
:
takeWhile (< 20) [3 * x | x <- [1 ..]]