I am trying to implement a function along the following lines (with the end of evaluating a function over many points in the probability simplex).

```
function grid(n, density=5)
ran = range(0, stop=1, length=density)
if n==1
return [i for i in ran]
elseif n==2
return [[i, j] for i in ran, j in ran]
elseif n==3
return [[i, j, k] for i in ran, j in ran, k in ran]
# Etc. for arbitrary n
end
end
```

This works:

```
julia> grid(2)
5×5 Array{Array{Float64,1},2}:
[0.0, 0.0] [0.0, 0.25] [0.0, 0.5] [0.0, 0.75] [0.0, 1.0]
[0.25, 0.0] [0.25, 0.25] [0.25, 0.5] [0.25, 0.75] [0.25, 1.0]
[0.5, 0.0] [0.5, 0.25] [0.5, 0.5] [0.5, 0.75] [0.5, 1.0]
[0.75, 0.0] [0.75, 0.25] [0.75, 0.5] [0.75, 0.75] [0.75, 1.0]
[1.0, 0.0] [1.0, 0.25] [1.0, 0.5] [1.0, 0.75] [1.0, 1.0]
```

but I understand that it’s not generally a good idea to actually *allocate* the grid that you are trying to iterate over, so I would like to modify this so that it returns an *iterator* instead of an array of arrays. And I need it to work for arbitrary `n`

.

In context, when the function I want to evaluate is given, I understand that I can replace `[f(i, j) for (i, j) in grid(2)]`

with `[f(i,j) for i in ran, j in ran]`

where `ran`

is as above and `n`

is known.

But how do I make this work for arbitrary `n`

?