GHCi中列表推导式缺失右方括号且控制台冻结问题求助
问题分析与解决
你的问题核心是惰性求值导致的无限遍历:
- Haskell的列表是惰性的,你用了无限列表
[1..],并且把13*x + 3 <= 1000这个上限条件放在过滤链的最后。 - 找到第一个符合条件的元素341之后,GHCi会继续无限遍历更大的x,检查是否满足所有条件(模12等于5、模11等于0且小于等于1000)。但实际上满足所有条件的下一个元素超过了1000,GHCi会一直遍历验证,导致控制台卡住,无法输出列表的闭合括号。
解决方法
方法一:直接限定x的有限范围
先计算x的最大可能值:(1000 - 3) // 13 = 76,把x的范围改成[1..76],避免无限遍历。修改后的推导式:
[13*x + 3 | x <- [1..76], rem (13*x + 3) 12 == 5, mod (13*x + 3) 11 == 0]
GHCi会遍历有限的x,快速完成计算,输出完整列表[341]。
方法二:提前放置上限条件
把13*x + 3 <= 1000移到过滤条件的最前面,让Haskell更早终止不符合上限的遍历:
[13*x + 3 | x <- [1..], 13*x + 3 <= 1000, rem (13*x + 3) 12 == 5, mod (13*x + 3) 11 == 0]
内容的提问来源于stack exchange,提问作者sandy
相关产品推荐
相关产品推荐

