What do you ask, if possible, will break link transparency, at least for a pure function (the result of a pure function may depend on some global variables, but not on the configuration file, could it)?
Usually people avoid this type of situation by passing implicitly configuration in the form of data through Monad. Alternatively (if you are happy to reorganize your code a bit), you can use the implicit extenson parameter , which was theoretically created to solve this type of problem, but in practice it really does not work. However, if you really need to, you can use unsafePerformIO and ioRef to have an upper level mutable state that is dirty and frowned up. You need to change the state with a high level, because you must be able to change the "mutate" of your initial configuration when loading it.
Then you get things like this:
myGlobalVar :: IORef Int {-
mb14 source share