Haskell 是一种惰性语言。在“需要”结果之前,它不会评估结果。
现在,只需 打印 一个值就会导致所有的值都是“需要的”。换句话说,如果你在 GHCi 中键入一个表达式,它会尝试打印出结果,这会导致它全部被计算。通常这就是你想要的。
sprint 命令(它是 GHCi 功能,不是 Haskell 语言的一部分)允许您查看此时已评估了多少值。
例如:
Prelude> let xs = [1..]
Prelude> :sprint xs
xs = _
所以,我们刚刚声明了xs,目前尚未对其进行评估。现在让我们打印出第一个元素:
Prelude> head xs
1
Prelude> :sprint xs
xs = 1 : _
现在 GHCi 已经评估了榜单的头部,但仅此而已。
Prelude> take 10 xs
[1,2,3,4,5,6,7,8,9,10]
Prelude> :sprint xs
xs = 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : _
现在评估了前 10 个元素,但还剩下更多。 (因为xs 是一个无限列表,这并不奇怪。)
您可以构造其他表达式并一次评估它们以查看发生了什么。这实际上是 GHCi 调试器的一部分,它可以让您一次一点地单步执行您的代码。特别是如果你的代码陷入无限循环,你不想print 任何东西,因为这可能会锁定 GHCi。但是你仍然想看看发生了什么......因此sprint,它可以让你看到到目前为止评估的内容。