Говорят, что функция Haskell seq принудительно вычисляет свой первый аргумент и возвращает второй. Он используется для добавления строгости к оценке выражений. Итак, как следующее может просто вернуть 5:
seq [1..] 5
Разве он не должен застревать в попытках построить бесконечный список?
seq (undefined, undefined) True
не будет оцениватьundefined
s. То же самое дляseq (undefined : undefined) True
. Это связано с тем, чтоseq
оценивает только достаточно, чтобы открыть первый конструктор, и не углубляется (см. такжеdeepseq
). - person chi   schedule 27.02.2019seq
видит[1..]
и оценивает его как1 : [2..]
, затем останавливается. Хвост остается неоцененным до тех пор, пока он кому-то действительно не понадобится. - person chepner   schedule 27.02.2019