列表理解不以方括号结尾,控制台冻结

san*_*ndy 2 haskell ghci

在 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,但它确实缺少第二个方括号,并且控制台冻结了。

Fyo*_*kin 7

您的程序进入无限循环。

第一个数字是 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。不会生成更多 的值。