让递归在 Haskell

Let recursiveness in Haskell

有人可以用以下输入解释这段代码的行为吗:[[1,2],[3,4]]?

infiniteList ls = let v = ls ++ v
                  in concat v

结果是一个无限列表,但我不明白为什么。我明白诀窍在于:

ls ++ v

但是既然我们没有为变量定义初始值,那么 let 究竟是如何工作的呢v

要评估v,只需将其替换为其定义:

v = ls ++ v
  = ls ++ ls ++ v
  = ls ++ ls ++ ls ++ v
  = ls ++ ls ++ ls ++ ls ++ v
  = ls ++ ls ++ ls ++ ls ++ ls ++ v
  = ls ++ ls ++ ls ++ ls ++ ls ++ ls ++ v

显然这永远不会结束。