map fun [0 .. ]
where
fun n
| even n = n `quot` 2
| otherwise = (1 - n) `quot` 2
No hay implementaciones estándar para mostrar todos los puntos en ℤ k . Ni siquiera para k == 1
, realmente. Pero con cualquier enumeración de ℤ y un producto cartesiano de dos listas que generan cualquier par en un índice finito, incluso si las listas son infinitas (algunas implementaciones posibles here), puede hacer las suyas propias.
integers :: [Integer]
integers = -- whatever is your favourite implementation
-- get all pairs at finite index, even for infinite input lists
--
cartesian :: [a] -> [b] -> [(a,b)]
cartesian xs ys = ???
-- enumDim k enumerates the points in ℤ^k, to avoid type problems, the points
-- are represented as lists of coordinates, not tuples
enumDim :: Int -> [[Integer]]
enumDim k
| k < 0 = error "Can't handle negative dimensions"
| k == 0 = [[]]
| otherwise = map (uncurry (:)) $ cartesian integers (enumDim (k-1))
-- alternative:
{-
| k == 1 = map return integers
| otherwise = map (uncurry (++)) $ cartesian (enumDim h) (enumDim (k-h))
where
h = k `quot` 2
-}
Por qué 'concat' cuando ya estás en una lista por comprensión? 'enteros = 0: [y | x <- [1 ..], y <- [x, -x]] '. –
@DanielWagner: Es cierto, me perdí esa solución :) –