Haskell 是一种惰性语言。直到“需要”结果时,它才会评估结果。
现在,只需printing一个值导致所有它都被“需要”。换句话说,如果您在 GHCi 中键入一个表达式,它会尝试打印结果,这会导致所有结果都被计算。通常这就是你想要的。
The 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
is an 无限列表,这并不奇怪。)
您可以构造其他表达式并一次对它们进行一些计算以查看发生了什么。这实际上是 GHCi 调试器的一部分,它可以让您一次一点地单步调试代码。特别是如果你的代码陷入无限循环,你不想print
任何东西,因为这可能会锁定 GHCi。但你仍然想看看发生了什么......因此sprint
,它可以让您查看到目前为止评估的内容。