【发布时间】:2020-04-13 13:41:15
【问题描述】:
考虑程序:
l = [0..10]
l' = map (+1) [0..10]
使用 GHCi 运行它,然后输入 :sprint l 和 :sprint l' 将显示两个列表都未评估。但是,在运行length l 和length l' 之后再次使用sprint:
l = [0,1,2,3,4,5,6,7,8,9,10]
和
l' = [_,_,_,_,_,_,_,_,_,_,_]
我已经进行了类似的实验,并尝试使用let 将变量绑定到 GHCi 中的列表,但是只有在 l(如上在程序顶层定义)的情况下,列表总是被完全评估。
这些行为都指向优化功能,但我想知道是否有更详细的答案(策略)“幕后”。
【问题讨论】:
-
嗯,元素永远不会被评估,因为我们不需要它们,也不做任何比较,与元素的相等性检查。这与列表没有太大关系,它会发生在所有数据结构中。
-
旁注:一个潜在的混淆来源可以通过使列表单态来消除 (
[0 :: Integer ..10])。这样,从文件加载定义应该与在 GHCi 提示符下输入定义具有相同的效果。 -
我在这里没有看到实际问题。
标签: haskell evaluation strictness