Haskell producto cartesiano de listas infinitas

Quiero generar un espacio vectorial a partir de un par de bases, que se parece a:

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

Cuando examino la salida, parece que estoy obteniendo[0, e2, 2*e2,...] (es decir,x nunca supera los 0). Qué tipo de sentido tiene cuando pienso en cómo escribiría el código para comprender esta lista.

Escribí un código para tomar "shells" en expansión desde el origen (primero las entradas con la norma 0, luego con la norma 1, luego la norma 2 ...) pero esto es un poco molesto y específico de Z ^ 2 - Me gustaría tiene que reescribirlo para Z ^ 3 o Z [i] etc. ¿Hay alguna forma más limpia de hacerlo?

Respuestas a la pregunta(4)

Su respuesta a la pregunta