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
相关产品推荐
相关产品推荐

