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

在Haskell中,脊柱狭窄这一术语经常与惰性评估相关。虽然我对这意味着什么有一个模糊的理解,但最好能有一个更具体的解释:

  • 数据结构的脊椎是什么
  • 脊柱狭窄是什么意思
  • 比较严格的数据结构和懒惰的数据结构有什么好处
    • 下面是一个例子

      > 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]