Haskell-なぜこのリスト内包は無限のリストを返すのですか?

Jan 16 2021
[3 * x | x <- [1 ..], 3 * x < 20]

私はこれがなぜ与えるのか本当に理解していません

[3,6,9,12,15,18

そして終わりが見つからない

回答

14 chi Jan 15 2021 at 23:37

のセマンティクス

[3 * x | x <- [1 ..], 3 * x < 20]

のすべての要素を試し[1..]、フィルター条件を満たす要素を維持すること3*x<20です。

人間はx、条件を偽造する最初の後で、より大きな値をすべて試す意味がないことを理解できますが、Haskellはとにかくそれらを試し、一種の無限ループで立ち往生します。

これは、一般的なケースでは、条件が再び真になる可能性があるためです。

[3 * x | x <- [1 ..], 3 * x < 20 || x == 1000000 ]

一般に、これ以上解決策がないかどうかを検出することは決定不可能であるため、Haskellは、他のプログラミング言語と同様に、最後の解決策の後で停止することを選択できません。

フィルタリング条件を満たさない最初の値の後でリストを停止する場合は、次を使用しますtakeWhile

takeWhile (< 20) [3 * x | x <- [1 ..]]