Functional programming 使用函数编程方法在网格的(x,y)位置上迭代

Functional programming 使用函数编程方法在网格的(x,y)位置上迭代,functional-programming,rust,Functional Programming,Rust,我想在二维网格中迭代位置(x,y),并为每个位置调用一个函数(提供x和y作为参数)。我知道如何使用for循环来实现这一点,但我想使用函数式编程方法来编写它,以便以后可以利用像Rayon这样的库。我已经设法建立了一个功能版本,但它似乎很复杂,我想问是否有一个更干净的方法来实现这一点 下面是计算网格中所有2x2面片的最大和的一个小示例: use std::cmp::max; const WIDTH: usize = 4; const HEIGHT: usize = 3; type Grid =

我想在二维网格中迭代位置
(x,y)
,并为每个位置调用一个函数(提供
x
y
作为参数)。我知道如何使用
for
循环来实现这一点,但我想使用函数式编程方法来编写它,以便以后可以利用像Rayon这样的库。我已经设法建立了一个功能版本,但它似乎很复杂,我想问是否有一个更干净的方法来实现这一点

下面是计算网格中所有2x2面片的最大和的一个小示例:

use std::cmp::max;

const WIDTH: usize = 4;
const HEIGHT: usize = 3;

type Grid = [[u32; WIDTH]; HEIGHT];

fn main() {
    let grid: Grid = [
        [1, 3, 5, 8], 
        [3, 9, 4, 2], 
        [3, 4, 5, 0],
    ];

    let coords = (0..WIDTH - 1).flat_map(|x| (0..HEIGHT - 1).map(move |y| (x, y)));
    let max_sum = coords.map(|(x, y)| sum_2x2(x, y, &grid)).max().unwrap();
    println!("Max 2x2 patch: {}", max_sum);
}

fn sum_2x2(x: usize, y: usize, grid: &Grid) -> u32 {
    [
        grid[y][x],
        grid[y][x + 1],
        grid[y + 1][x],
        grid[y + 1][x + 1],
    ]
    .iter()
    .sum()
}
直线
let-coords=let-coords=(0..WIDTH-1).平面地图(|x |(0..HEIGHT-1).地图(move | y |(x,y))对于这样一个简单的任务来说似乎相当复杂。在Python中,我将执行以下操作以获得位置(我认为这要干净得多):

来自itertools导入产品的
>>
>>>产品(范围(高度-1)、范围(宽度-1))

有没有更好的方法来编写此代码,还是我只需要习惯它?

您可以使用或之类的循环理解框来简化代码。 例如,对于
,使用
map\u:

let max_sum = map_for!(
    move;
    x <- 0..WIDTH-1;
    y <- 0..HEIGHT-1;
    => sum_2x2(x, y, &grid)
).max().unwrap();
让max\u sum=map\u表示!(
移动
x另一个选项是使用Itertools板条箱,它有许多涉及迭代器的方便方法

use itertools::Itertools;

(0..WIDTH-1).cartesian_product(0..HEIGHT-1).map(|(x, y)| sum_2x2(x, y, &grid)).max()

正如@hellow在评论中指出的,板条箱中有一个宏可以满足我的需要。使用它,我的代码可以像这样重写:

use itertools::iproduct;
...
let coords = iproduct!(0..WIDTH - 1, 0..HEIGHT - 1);
...
这正是我想要的。感谢所有在这里评论/发布答案的人


PS:如果您想将itertools迭代器与人造丝一起使用,您可以通过使用以下方法来实现:例如,
IPProduct!(0..WIDTH-1,0..HEIGHT-1)。par_iter()
。我花了一段时间才弄明白,因为
par\u iter
into\u par\u iter
不起作用。

提出了一个很好的问题,可能会在CodeReview上找到一个更好的归宿。我担心这与Stackoverflow无关,但我可以为这项工作推荐itertools。请记住,上面的示例代码是离题的。所以请确保不要导出请以您的代码为例,但要明确指出您正在寻找
[[u32;WIDTH];HEIGHT]中的最大值
array,找到了一个解决方案,但感觉应该有一个更实用的方法。请记住,交叉发布是不受欢迎的。迭代器中的
-1
似乎不正确,因为
已经不包括上限。
我也这么认为,直到我注意到
sum_2x2
转到
x+1
y+1