I often find this pattern in Haskell code:
options :: MVar OptionRecord options = unsafePerformIO $ newEmptyMVar ... doSomething :: Foo -> Bar doSomethi
If you are using MVar for holding settings or something similar, why don't you try reader monad?
foo :: ReaderT OptionRecord IO () foo = do options <- ask fireMissiles main = runReaderT foo (OptionRecord "foo")
(And regular Reader if you don't require IO :P)