Как замыкания определяют их тип в зависимости от характера, который им необходим для реализации? - PullRequest
0 голосов
/ 28 февраля 2019

Я пишу функцию, которая принимает различные реализации черт.Одним из них является закрытие.Некоторые замыкания требуют аннотации типа аргумента, а некоторые нет, в зависимости от их тел.

Пример ( детская площадка ):

fn main() {
    bar(|x| x);
    bar(|x: bool| !x); // Why is the annotation needed?
}

trait Foo<T> {
    type Output;
}

impl<F: Fn(T) -> O, T, O> Foo<T> for F {
    type Output = O;
}

fn bar(_: impl Foo<bool, Output = bool>) {}
  • Почему некоторые замыкания выводят тип аргумента, а другие требуют аннотации?

  • Возможно ли изменить черту или функцию, чтобы никогда не требовать аннотации?

Мое (недействительное) рассуждение состоит в том, что логический вывод одинаков для обоих замыканий:

  1. bar потребности Foo<bool, Output = bool>
  2. только Fn(bool) -> bool реализует Foo<bool, Output = bool>
  3. Закрытие должно быть |bool| -> bool

Тот факт, что отрицание (Not черта) отсоединяет тип ввода от типа вывода, не должен иметь значения, но, похоже, он как-то является решающим элементом.

...