Я бы порекомендовал возиться с командами :print
и :sprint
в ghci
, чтобы увидеть ленивую оценку в действии. Например:
Prelude> let names = ["Joe", "Jen", "Anne"]
Prelude> let hellos = map ((++) "Hello ") names
Prelude> head hellos
"Hello Joe"
Prelude> :sprint hellos
hellos = "Hello Joe" : _
Prelude> length hellos
3
Prelude> :sprint hellos
hellos = ["Hello Joe",_,_]
Prelude> last hellos
"Hello Anne"
Prelude> :sprint hellos
hellos = ["Hello Joe",_,"Hello Anne"]
Таким образом, вы можете видеть, как список постепенно оценивается, когда вы вызываете различные функции для него. _
представляет неоцененный гром.
Вы можете загрузить свой код в ghci
и поэкспериментировать аналогичным образом. Просто убедитесь, что вы присваиваете переменные, или они будут оцениваться REPL.