Исправление quantum-troll, (текущая версия) :
Без учёта ограничений он реализован корректно: контрвариативно по аргументам, ковариативно по возвращаемому значению.
Судя по возможности «забывателя»
Ничего там не забывается. Это всего лишь трюк для того, чтобы вызвать сабтайпинг вместо простой унификации.
Когда тайпчекер унифицирует трюк не проходит:
forall 'a, 'b, T; &'a &'b (), &'b T -> &'a T where 'b <: 'a
'a = 'static
-----
Ошибка, 'b <: 'static выполняется лишь в случае, когда 'b = 'static
&'static &'static <: &'static &'b
-----
fn(&'static &'b) <: fn(&'static &'static)
Исправление quantum-troll, :
Без учёта ограничений он реализован корректно: контрвариативно по аргументам, ковариативно по возвращаемому значению.
Судя по возможности «забывателя»
Ничего там не забывается. Это всего лишь трюк для того, чтобы вызвать сабтайпинг вместо простой унификации.
Когда тайпчекер унифицирует трюк не проходит:
forall 'a, 'b, T; &'a &'b (), &'b T -> &'a T where 'b <: 'a
'a = 'static
-----
Ошибка, 'b <: 'a выполняется лишь в случае, когда 'b = 'static
&'static &'static <: &'static &'b
-----
fn(&'static &'b) <: fn(&'static &'static)
Исходная версия quantum-troll, :
Без учёта ограничений он реализован корректно: контрвариативно по аргументам, ковариативно по возвращаемому аргументу.
Судя по возможности «забывателя»
Ничего там не забывается. Это всего лишь трюк для того, чтобы вызвать сабтайпинг вместо простой унификации.
Когда тайпчекер унифицирует трюк не проходит:
forall 'a, 'b, T; &'a &'b (), &'b T -> &'a T where 'b <: 'a
'a = 'static
-----
Ошибка, 'b <: 'a выполняется лишь в случае, когда 'b = 'static
&'static &'static <: &'static &'b
-----
fn(&'static &'b) <: fn(&'static &'static)