Я часто нахожу этот шаблон в коде Haskell:
options :: MVar OptionRecord
options = unsafePerformIO $ newEmptyMVar
...
doSomething :: Foo -> Bar
doSomething = unsafePerformIO $ do
opt <- readMVar options
doSomething' where ...
В принципе, есть запись параметров или что-то подобное, которое изначально устанавливается в начале программы. Поскольку программист ленив, он не хочет переносить запись options
по всей программе. Он определяет MVar
, чтобы сохранить его, определяемый уродливым использованием unsafePerformIO
. Программист гарантирует, что состояние устанавливается только один раз и до того, как произойдет какая-либо операция. Теперь каждая часть программы должна снова использовать unsafePerformIO
, просто чтобы извлечь параметры.
По-моему, такая переменная считается прагматически чистой (не бить меня). Существует ли библиотека, которая абстрагирует эту концепцию и гарантирует, что переменная задана только один раз, то есть, чтобы до инициализации не выполнялся вызов, и что не нужно писать unsafeFireZeMissilesAndMakeYourCodeUglyAnd
DisgustingBecauseOfThisLongFunctionName