首页 > 解决方案 > 这个函数会被懒惰地评估吗?

问题描述

我试图了解是否会懒惰地评估以下功能。

我的理解是“头”将从列表中获取第一项。optimizeTests 会仅评估 [Test] 中的第一项,还是会在随后调用 head 之前创建 [Test] 中的所有测试?

optimalTests :: State -> [Test]

--implementation here

getAnyTest :: State -> Test

getAnyTest s = head(optimalTests s)

标签: haskelllazy-evaluation

解决方案


我建议使用:printand: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 评估。


推荐阅读