haskell - 这个函数会被懒惰地评估吗?
问题描述
我试图了解是否会懒惰地评估以下功能。
我的理解是“头”将从列表中获取第一项。optimizeTests 会仅评估 [Test] 中的第一项,还是会在随后调用 head 之前创建 [Test] 中的所有测试?
optimalTests :: State -> [Test]
--implementation here
getAnyTest :: State -> Test
getAnyTest s = head(optimalTests s)
解决方案
我建议使用:print
and: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 评估。
推荐阅读
- c - 在 C 中匹配 Python 模数/余数
- kubernetes - 如何在 kubernetes 密钥中使用连字符键和连字符?
- scala - Spark 数据框填充
- excel - 如何在一个范围内打印值但在该范围内跳过第 41-55 行然后在第 55 行之后继续
- sql - 使用 groupby 子句的 oracle 查询
- c - Atoi() 针对错误注入的漏洞
- curl - POST 适用于 linux curl 但 403 Forbidden with node-fetch 和 windows curl UGGGG
- r - 在 R6 中填充类变量时出错 - 无法访问类变量
- next.js - 在 Prisma 中建模评级系统
- java - 此插入排序算法仅交换前 2 个元素并停止。我该如何解决?