Эта функция будет оценена лениво? - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь понять, будет ли следующая функция обрабатываться лениво.

Насколько я понимаю, "голова" возьмет первый элемент из списка. Оптимальные тесты будут просто оценивать первый элемент в [Test] или все тесты в [Test] будут созданы до последующего вызова head?

optimalTests :: State -> [Test]

--implementation here

getAnyTest :: State -> Test

getAnyTest s = head(optimalTests s)

Ответы [ 2 ]

3 голосов
/ 11 апреля 2019

Я бы порекомендовал возиться с командами :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.

0 голосов
/ 11 апреля 2019

Вы правы, он создаст только первое значение, ничего больше ...

Вы можете проверить это, вернув массив, который падает на втором элементе.

optimalTests _ = [aValidValue, error "crash!"]

Если программа не падает (это не происходит), это означает, что она никогда не пыталась оценить второй элемент.

...