Haskell 什么是脊柱狭窄
在Haskell中,脊柱狭窄这一术语经常与惰性评估相关。虽然我对这意味着什么有一个模糊的理解,但最好能有一个更具体的解释:Haskell 什么是脊柱狭窄,haskell,data-structures,lazy-evaluation,strictness,Haskell,Data Structures,Lazy Evaluation,Strictness,在Haskell中,脊柱狭窄这一术语经常与惰性评估相关。虽然我对这意味着什么有一个模糊的理解,但最好能有一个更具体的解释: 数据结构的脊椎是什么 脊柱狭窄是什么意思 比较严格的数据结构和懒惰的数据结构有什么好处 下面是一个例子 > length (undefined : 3 : 4 : undefined : []) 4 > length (2 : 3 : 4 : 5 : undefined) <<loop>> 这是否有益取决于上下文。考虑 -- appl
- 数据结构的脊椎是什么
- 脊柱狭窄是什么意思
- 比较严格的数据结构和懒惰的数据结构有什么好处
- 下面是一个例子
> length (undefined : 3 : 4 : undefined : [])
4
> length (2 : 3 : 4 : 5 : undefined)
<<loop>>
这是否有益取决于上下文。考虑
-- apply n times function f
iter n f = foldr (.) id $ replicate n f
list1 = iter 1000 (map succ) [1..10]
list2 = iter 1000 (map' succ) [1..10]
如果我要求标题列表1
我将强制仅在列表的第一个元素应用1000个地图。这意味着在此之后,内存中将有1000个分配的thunk占用空间
相反,
headlist2
将强制在整个列表上应用1000个地图。因此,所有1000个thunk可以立即被垃圾收集,回收内存。但是,在第一个示例中,length(2:3:4:5:undefined)
不会循环,但会立即给出一个异常,因为haskell中undefined不是“not termining expression”,尽管我明白你的意思,但以repl样式显示它会使confusing@Markus1189:如果您仍然想知道为什么它被称为spine,请在GHCi中尝试以下操作:让x=map(+1)[1..10]
,长度x
,:sprint x
。然后你会清楚地看到脊柱list@Zeta感谢您指出sprint命令!非常有用!我有一个简单的问题,为什么let x=“foo”
:sp x给了我x=\ucode>,但是let x=['f','o','o']
:sp x
给了我x=“foo”
分号。我相信GHC(I)可能在这里进行了一些优化。与立即分配字符列表不同,字符串可能以更紧凑的形式存储,直到真正需要字符串时才展开。不过,这只是一个猜测。@分号:chi是对的。使用:set-ddump siml-ddump ds
查看更多信息<代码>“foo”是一个CString
,而['f','o','o']
已经是一个列表,并在该点上进行评估。顺便说一句,最好是这样做,因为注释通知可能不会引起注意。
-- apply n times function f
iter n f = foldr (.) id $ replicate n f
list1 = iter 1000 (map succ) [1..10]
list2 = iter 1000 (map' succ) [1..10]