@SeunLanLege конечно, сделано.

аюсь написать функцию, которая объединяет две функции, первоначальный дизайн довольно прост, это функция, которая принимает две функции и возвращает составную функцию, которую я затем могу составить с другими функциями (так как у rust нет параметров rest). Но я натолкнулся на длинную жесткую стену, построенную с разочаровывающими бесполезными ошибками компилятора.

Моя функция сочинения:

fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box<Fn(A) -> C + 'a>
    where F: 'a + Fn(A) -> B + Sized, G: 'a + Fn(B) -> C + Sized
{ 
    Box::new(move |x| g(f(x)))
}

Как я хотел бы использовать это:

fn main() {
    let addAndMultiply = compose(|x| x * 2, |x| x + 2);
    let divideAndSubtract = compose(|x| x / 2, |x| x - 2);

    let finally = compose(*addAndMultiply, *divideAndSubtract);
    println!("Result is {}", finally(10));
}

rustc это не нравится, что бы я ни пытался, границы черт никогда не удовлетворяются. Ошибка:

➜ cargo run                                                                                                                                               
   Compiling flowtree v0.1.0 (file:///home/seunlanlege/Projects/flowtree)
error[E0277]: the trait bound `std::ops::Fn(_) -> _: std::marker::Sized` is not satisfied
  --> src/main.rs:11:19
   |
11 |     let finally = compose(*addAndMultiply, *divideAndSubtract);
   |                   ^^^^^^^ the trait `std::marker::Sized` is not implemented for `std::ops::Fn(_) -> _`
   |
   = note: `std::ops::Fn(_) -> _` does not have a constant size known at compile-time
   = note: required by `compose`

error[E0277]: the trait bound `std::ops::Fn(_) -> _: std::marker::Sized` is not satisfied
  --> src/main.rs:11:19
   |
11 |     let finally = compose(*addAndMultiply, *divideAndSubtract);
   |                   ^^^^^^^ the trait `std::marker::Sized` is not implemented for `std::ops::Fn(_) -> _`
   |
   = note: `std::ops::Fn(_) -> _` does not have a constant size known at compile-time
   = note: required by `compose`

error: aborting due to 2 previous errors

error: Could not compile `flowtree`.

To learn more, run the command again with --verbose.

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

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