If the value is dynamically allocated, then how do you use it inside a function without passing it? And if you’re passing a value, why not determine the wanted behavior based on passed value instead? The following is obviously not valid Haskell:
module Foo (foo) where
withIOScopedRef 5 $ \x ->
let foo = _ x
The point here is that x is not a value , it’s a place. foo expects a value to be there when it executes, user knows they can augment it.