[2*n + 3*m +1 | m <- [0..], n <- [0..]]
не будет работать, потому что он начинается с m = 0
и проходит через все n
, а затем имеет m = 1
и проходит через все n и т. Д. Но только часть m = 0
бесконечна Таким образом, вы никогда не получите m = 1, 2 или 3 и т. д. Так что [2*n + 3*m +1 | m <- [0..], n <- [0..]]
точно так же, как [2*n + 3*0 +1 | n <- [0..]]
.
Чтобы сгенерировать их все, вы должны либо осознать, как и пользователи vartec и Hynek -Pichi- Vychodil, что набор чисел, который вам нужен, это просто натуральные числа - {0,2}. Или вам нужно как-то перечислить все пары (m, n), чтобы m, n были неотрицательными. Один из способов сделать это - пройти по каждой из «диагоналей», где m + n
одинаково. Итак, мы начинаем с чисел, где m + n = 0
, а затем с тех, где m + n = 1
и т. Д. Каждая из этих диагоналей имеет конечное число пар, поэтому вы всегда будете переходить к следующей и всем парам (m , п) в конечном итоге будет засчитано.
Если мы допустим i = m + n
и j = m
, то [(m, n) | m <- [0..], n <- [0..]]
станет [(j, i - j) | i <- [0..], j <- [0..i]]
Так что для вас, вы можете просто сделать
[2*(i-j) + 3*j +1 | i <- [0..], j <- [0..i]]
(Конечно, этот метод также даст вам дубликаты, потому что в вашем выражении есть несколько (m, n) пар, которые генерируют одинаковое число.)