让Haskell中的递归

Big*_*ter 3 recursion haskell list infinite let

可能有人解释这与下面的输入一小段代码的行为:[[1,2],[3,4]]

infiniteList ls = let v = ls ++ v
                  in concat v
Run Code Online (Sandbox Code Playgroud)

结果是一个无限的列表,但我没有意识到为什么.我明白了诀窍在于:

ls ++ v
Run Code Online (Sandbox Code Playgroud)

但是,因为我们没有定义变量的初始值,所以如何正常工作v

Cod*_*ice 7

要评估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
Run Code Online (Sandbox Code Playgroud)

显然,这永远不会结束.

  • 不要认为`ls ++ v`是构造一个然后赋给`v`的值; 相反,它只是评估"v"的*规则*."当你看到`v`时,用'ls ++ v`替换它." 是否需要评估递归出现的"v"取决于原始`v`的消费者. (5认同)
  • @BigMeister因为Haskell是惰性的,所以只有在绝对必要时才会发生这种评估,例如当你打印出调用`infiniteList`的结果时. (2认同)