That doesn't actually work, because you're limiting the return type of the method in the implementation of the functor. So by implementing that protocol, you could have one mapping from Int to String (say), but not another from Int to Double.
Put another way, you need to specify FunctorResult at implementation time, and the whole point is to only have to specify it at call time.