是否会延迟评估此功能?

时间:2019-04-11 19:32:36

标签: haskell lazy-evaluation

我试图了解是否会延迟评估以下函数。

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

optimalTests :: State -> [Test]

--implementation here

getAnyTest :: State -> Test

getAnyTest s = head(optimalTests s)

2 个答案:

答案 0 :(得分:3)

我建议您将:print中的:sprintghci命令弄混,以查看实际的惰性评估。例如:

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!"]

如果程序不会崩溃(不会崩溃),则表示它从未尝试评估第二项。