Оценка списка в слабой головной нормальной форме

Учитывая следующий список от 1 до 100:

> let x = [1..100]

Я выполняю sprint x, чтобы наблюдать его неоценимое значение.

> :sprint x
x = _

Затем я запустил seq, чтобы оценить его в Нормальной форме слабых головок:

> seq x ()
()

Но повторное выполнение sprint x показывает (что я думаю) одно значение.

> :sprint x
x = _

Почему это?

Ответы

Ответ 1

Я думаю, что этот комментарий bheklilr должен быть отмечен как ответ:

Каков тип x? Если он (Num a, Enum a) => [a], тогда это не будет работать так, как ожидалось. Попробуйте let x = [1..100] :: [Int]. В действительности, когда вы печатаете x с более общим типом, GHCi специализируется на Integer для печати. Это означает, что значения, которые вы видите напечатанные, на самом деле не сохраняются в x thunk. Использование конкретного типа позволяет избежать этой проблемы.

С дополнительной заметкой Дэвида Янга, что эта проблема не будет возникать в версиях GHCi раньше 7,8, когда ограничение мономорфизма было разрешено.