Насколько мне известно, списочные выражения повторяют каждую связанную переменную в обратном порядке появления:
[ (x,y) | x <- [0,1], y <- [0,1] ] == [(0,0),(0,1),(1,0),(1,1)]
[ (x,y) | x <- [0,1], y <- [0..] ] == [(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),...]
[ (x,y) | x <- [0..], y <- [0,1] ] == [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1),...]
В случае бесконечных списков можно столкнуться с проблемами подобным образом.Второй пример выше показывает, как одна переменная в бесконечном списке предотвратит изменение другой, но третий показывает, что изменение порядка исправляет это.
Чтобы продемонстрировать, как ваше текущее понимание списка повторяется через a
и b
:
[ (a,b) | a <- [1..], b <- [1..] ] == [(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),...]
Эта проблема аналогична проблеме второго примера.Я не знаю достаточно теории чисел, чтобы помочь вам в дальнейшем эффективном решении, но это фундаментальная проблема вашей реализации.