You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么该Haskell不动点计算不会终止?如何得到预期返回结果?

问题原因
  • 你定义的xs本质是无限递归结构,Haskell的惰性求值虽然可以生成前7个符合预期的元素,但求值器默认会尝试推导列表的尾部是否还有更多元素,不会主动在你预期的第7位停止。
  • 当输出完第7个元素4后,求值器需要判断列表是否已经结束(即是否遇到[]),此时需要计算second xs的第4个元素,这个值依赖xs的第8个元素,而xs的第8个元素又反过来依赖second xs的第4个元素,进入无限递归死锁,因此程序卡住不会终止。
解决方法

最简单的方案是手动指定你需要的列表长度,用take函数截断无限递归的求值过程:

second (x:y:xs) = y : second xs  -- returns every second element of a list
second _ = []

xs = take 7 $ [1,2,3,4] ++ second xs

此时在GHCi中求值xs就会直接输出[1,2,3,4,2,4,4]并正常终止,take 7会强制在获取到7个元素后停止后续的递归求值,避免死循环。

内容的提问来源于stack exchange,提问作者eivour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:15:01