What do you mean by module arguments?
And how a module would depend on other modules, through a use macro?
Module X depends on Module Y and uses functions exposed in module Y. However when I define module X I don’t specify what that module Y is, rather it is an argument.
Later I can pass a compatible implementation of Y, say Y1 to X as a parameter and get a module X1 which uses Y1.
This article by Dr. Axel Rauschmayer explains it in much more detail.
You can probably define a protocol 1 to which your module implementations would adhere, but that would only provide some kind of polymorphism so that conforming modules could be “swapped in later” …
Yes, I understand that protocols are the primary solution for polymorphism in elixir.
Parameterised modules are somewhat more generic given that it does not necessarily have to resolve the implementation based on the signature of a struct. The consumer of the generic module is free to pass in any compatible module and the implementation will use that.