Haskell-이 목록 이해가 무한 목록을 반환하는 이유는 무엇입니까?

Jan 15 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 ..]]