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