Haskell produto cartesiano de listas infinitas

Quero gerar um espaço de vetores a partir de um par de bases, parecido com:

genFromPair (e1, e2) = [x*e1 + y*e2 | x <- [0..], y <- [0..]]

Quando examino a saída, parece que estou recebendo[0, e2, 2*e2,...] (ou seja,x nunca fica acima de 0). O que faz sentido quando penso em como escreveria o código para entender essa lista.

Eu escrevi um código para extrair "conchas" da origem (primeiro as entradas com a norma 0, depois com a norma 1, depois com a norma 2 ...), mas isso é meio irritante e específico para Z ^ 2 - eu precisa reescrevê-lo para Z ^ 3 ou Z [i] etc. Existe uma maneira mais limpa de fazer isso?

questionAnswers(4)

yourAnswerToTheQuestion