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

Haskell列表推导使用无限列表时过滤条件未生效触发死循环原因问询

故障原因

你的过滤条件本身解析和生效逻辑完全正常,死循环的核心诱因是使用了无界的无限列表[1..]作为列表推导的生成源。

  • Haskell列表推导的执行顺序为:从生成源按顺序取单个元素 → 匹配过滤条件 → 符合条件的元素执行映射逻辑输出。[1..]是从1开始的无限递增序列,没有终止边界。
  • 调用mult 10时,程序会依次取x=1到x=10,所有符合x<=10的元素计算后输出,也就是你看到的2,4...20序列。但x=10之后程序不会停止从生成源取值,会继续取x=11、12、13……逐个判断x<=10,所有判断结果都为False,不会产生新的输出,但无限列表永远无法遍历完毕,程序就会陷入无限空循环。
  • 输出缺少末尾的]是Haskell惰性求值的特性:只有确认整个列表已经完全遍历结束时,才会输出列表终止的右方括号,程序永远卡在遍历环节,自然不会打印该符号。
修复方案

可选两种修改方式:

  • 直接给生成源设置上界,规避无限列表:
    mult y = [x*2 | x <- [1..y]]
  • 若需保留过滤类写法,用takeWhile提前截断无限列表:
    mult y = [x*2 | x <- takeWhile (<= y) [1..]]

内容的提问来源于stack exchange,提问作者Jérémy Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:57:03