我试图了解是否会延迟评估以下函数。
我的理解是“ head”将从列表中获得第一项。 OptimalTests会只评估[Test]中的第一项,还是会在随后调用head之前创建[Test]中的所有测试?
optimalTests :: State -> [Test]
--implementation here
getAnyTest :: State -> Test
getAnyTest s = head(optimalTests s)
答案 0 :(得分:3)
我建议您将: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将对它们进行评估。
答案 1 :(得分:0)
您是对的,它只会创建第一个值,没有别的...
您可以通过返回在第二个元素上崩溃的数组进行测试。
optimalTests _ = [aValidValue, error "crash!"]
如果程序不会崩溃(不会崩溃),则表示它从未尝试评估第二项。