在 GHCi 中输入列表推导式不会生成列表,最后的方括号丢失,并且控制台冻结。这就是我想出的:
[13*x + 3 | x <- [1..], rem (13*x + 3) 12 == 5, mod (13*x + 3) 11 == 0, 13*x + 3 <= 1000]
Run Code Online (Sandbox Code Playgroud)
我相信问题出在x <- [1..], 或13*x + 3 <= 1000。我的13*x + 3 <= 1000意思是确定 x in 可以取的值的上限x <- [1..]。
我得到了一个结果[341,但它确实缺少第二个方括号,并且控制台冻结了。
您的程序进入无限循环。
第一个数字是 341,但为了生成下一个数字,您的程序会不断查找 的所有后续值x,评估这些值的所有防护,并检查所有防护是否为 true。最后一个守卫13*x + 3 <= 1000永远不会再变为真,因此程序只是不断枚举x永远的值。它正在寻找下一个x所有守卫都为真的这样的东西,一旦找到,它就会打印它。但这样的事x永远不会发生。
如果您希望列表结束一次x*13 + 3 > 1000,则必须使用takeWhile:
... | x <- takeWhile (\y -> y*13 + 3 <= 1000) [1..], ...
Run Code Online (Sandbox Code Playgroud)
这样,列表实际上会在达到 1000 时停止x。不会生成更多 的值。