Dependency injection is a degenerate form of implicit parameter passing, and the purpose is essentially the same, to solve what’s called The Configurations Problem:
The configurations problem is to
propagate run-time preferences
throughout a program, allowing
multiple concurrent configuration sets
to coexist safely under statically
guaranteed separation.
Dependency Injection frameworks compensate for the lack of implicit parameters, Curried functions, and convenient facilities for monads in the language.