The check x<1000 is used to decide what to include in the filtered list, not to stop the evaluation. In other words, you are giving to ghci an infinite list and it will do x<1000 for every element of the list. If you want to take elements until a predicate is True, use takeWhile. It doesn't matter that Haskell is lazy, the filtered list is evaluated because ghci print it. If you want to avoid this, use let
let l = [x | x <- [1..], x < 1000]