Haskell - Warum gibt dieses Listenverständnis eine unendliche Liste zurück?

Jan 15 2021
[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

14 chi Jan 15 2021 at 23:37

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, xder 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 ..]]