【问题标题】:Haskell infinite loop with simply re-let actionHaskell 无限循环,只需重新操作
【发布时间】:2012-04-06 13:53:03
【问题描述】:

我有这样的代码:

Prelude> let n = [1,2,3,4]
Prelude> n
[1,2,3,4]
Prelude> 0:n
[0,1,2,3,4]
Prelude> let n = 0:n

当我在上层之后输入 Haskell 解释器时:

Prelude> n

我得到了无限的结果:

[0,0,0,0,0,0,0,0,0

而打印“0”的地方是无限的。

为什么会得到这样的结果?
是否有一些递归的东西,它为什么/如何在解释器级别工作?
我可以在 GHCi 上捕获堆栈溢出吗?

谢谢,
最好的问候!

【问题讨论】:

  • n=[0,1,2,3,4]n=n:0 冲突你不同意吗?

标签: haskell loops infinite


【解决方案1】:

n 的新绑定会影响旧绑定。您无需在 Haskell 中重新分配变量。

【讨论】:

    【解决方案2】:

    乔希的意思是你对 n 的定义扩展为:

    0:n.  -- note n still equals 0:n, just like you said
    0:0:n. -- note n _still_ equals 0:n
    0:0:0:n
    ...
    

    【讨论】:

      【解决方案3】:

      Haskell 的 let 与其他语言(如 ML)中的 letrec 类似:允许绑定是递归的。换句话说,n = 0:nn 定义为一个列表,其中第一个元素是0,列表的其余部分等于n。也就是说n的第二个元素等于n的第一个元素,即0等。

      由于懒惰,在 Haskell 中无限列表是可以的。如果您只使用列表的前 10 个元素,则永远不会评估第 11 个及以后的元素。

      【讨论】:

        猜你喜欢
        • 2016-01-27
        • 2011-02-23
        • 1970-01-01
        • 2013-10-05
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多