Несоответствия типов, разрешающие замыкание, которое принимает аргументы по ссылке

Я сталкиваюсь со странной парой ошибок при попытке скомпилировать мой код Rust ниже. В поисках других с похожими проблемами я наткнулсядругой вопрос с той же комбинацией (казалось бы, противоположных) ошибок, но не смог обобщить решение оттуда к моей проблеме.

По сути, мне, кажется, не хватает тонкости в системе владения Rust. При попытке скомпилировать (очень урезанный) код здесь:

struct Point {
    x: f32,
    y: f32,
}

fn fold<S, T, F>(item: &[S], accum: T, f: F) -> T
where
    F: Fn(T, &S) -> T,
{
    f(accum, &item[0])
}

fn test<'a>(points: &'a [Point]) -> (&'a Point, f32) {
    let md = |(q, max_d): (&Point, f32), p: &'a Point| -> (&Point, f32) {
        let d = p.x + p.y; // Standing in for a function call
        if d > max_d {
            (p, d)
        } else {
            (q, max_d)
        }
    };

    fold(&points, (&Point { x: 0., y: 0. }, 0.), md)
}

Я получаю следующие сообщения об ошибках:

error[E0631]: type mismatch in closure arguments
  --> src/main.rs:23:5
   |
14 |     let md = |(q, max_d): (&Point, f32), p: &'a Point| -> (&Point, f32) {
   |              ---------------------------------------------------------- found signature of `for<'r> fn((&'r Point, f32), &'a Point) -> _`
...
23 |     fold(&points, (&Point { x: 0., y: 0. }, 0.), md)
   |     ^^^^ expected signature of `for<'r> fn((&Point, f32), &'r Point) -> _`
   |
   = note: required by `fold`

error[E0271]: type mismatch resolving `for<'r> <[closure@src/main.rs:14:14: 21:6] as std::ops::FnOnce<((&Point, f32), &'r Point)>>::Output == (&Point, f32)`
  --> src/main.rs:23:5
   |
23 |     fold(&points, (&Point { x: 0., y: 0. }, 0.), md)
   |     ^^^^ expected bound lifetime parameter, found concrete lifetime
   |
   = note: required by `fold`

(Ссылка Rust Playground для этого кода, для удобства.)

Мне кажется, что функция, которую я поставляюfold следует правильно проверить тип ... Что мне здесь не хватает и как я могу исправить это?

Ответы на вопрос(1)

Ваш ответ на вопрос