Haskell コードでこのパターンをよく見かけます。
options :: MVar OptionRecord
options = unsafePerformIO $ newEmptyMVar
...
doSomething :: Foo -> Bar
doSomething = unsafePerformIO $ do
opt <- readMVar options
doSomething' where ...
基本的に、プログラムの開始時に最初に設定されたオプションなどの記録があります。options
プログラマーは怠け者なので、プログラム全体に記録を残したくありません。彼はそれMVar
を維持するために を定義しています - の醜い使い方によって定義されていますunsafePerformIO
。プログラマーは、操作が行われる前に状態が一度だけ設定されるようにします。unsafePerformIO
ここで、オプションを抽出するためだけに、プログラムの各部分を再度使用する必要があります。
私の意見では、そのような変数は実用的に純粋であると考えられています(私を打ち負かさないでください)。この概念を抽象化し、変数が一度だけ設定されるようにするライブラリがありますか。つまり、その初期化の前に呼び出しが行われず、書き込む必要がないことを保証しますunsafeFireZeMissilesAndMakeYourCodeUglyAnd
DisgustingBecauseOfThisLongFunctionName