It says these are conflicting implementations of trait From<_>, but why? These are clearly non-intersecting: if the function returns i32 it cannot return String or f32...
This is how I look at it now: technically, no type can implement both Fn()->i32 and Fn()->f32, as we know that only functions and closures implement Fn, and every function or closure has the exact return type. But theoretically in the future it can become possible to implement Fn() traits for any type and thus to implement both Fn()->i32 and Fn()->f32 for one type, so that is why compiler complains.
No, but there is no disjointness when trait parameters vary. I can implement From<A> and From<B> for my struct after all. Whereas for a given set of implementation inputs,[1] you can only have one associated type. That's why disjointness based on associated types makes logical sense.
On stable, any closure / function time / function pointer which is higher-ranked over lifetimes implements some Fn* traits for multiple trait parameter types.
On unstable, you're as unrestricted with the Fn* traits as you are with any other trait, such as From.
trait, concrete trait parameters, and concrete implementing type âŠī¸
Unless the Fn* traits change shape, which is probably impossible for backwards compatibility reasons, a type can't implement Fn<(), Output = i32> (aka Fn() -> i32) and Fn<(), Output = f32> (aka Fn() -> f32) as that would be two implementations of Fn<()> for the same type.
Just like you can't implement Deref twice, say. The fact that it has an associated type is irrelevant.