Я пишу функцию, которая принимает различные реализации черт.Одним из них является закрытие.Некоторые замыкания требуют аннотации типа аргумента, а некоторые нет, в зависимости от их тел.
Пример ( детская площадка ):
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>) {}
Почему некоторые замыкания выводят тип аргумента, а другие требуют аннотации?
Возможно ли изменить черту или функцию, чтобы никогда не требовать аннотации?
Мое (недействительное) рассуждение состоит в том, что логический вывод одинаков для обоих замыканий:
bar
потребности Foo<bool, Output = bool>
- только
Fn(bool) -> bool
реализует Foo<bool, Output = bool>
- Закрытие должно быть
|bool| -> bool
Тот факт, что отрицание (Not
черта) отсоединяет тип ввода от типа вывода, не должен иметь значения, но, похоже, он как-то является решающим элементом.