次のような IO アクションがあるとします。
lookupStuff :: InputType -> IO OutputType
これは、DNS ルックアップや、時不変データに対する Web サービス呼び出しなどの単純なものである可能性があります。
次のように仮定します。
操作は例外をスローしたり、発散したりしません。
モナドがなければ
IO
、関数は純粋になります。つまり、同じ入力パラメータに対して結果は常に同じになります。アクションは再入可能です。つまり、複数のスレッドから同時に安全に呼び出すことができます。
この
lookupStuff
操作にはかなりの (時間) 費用がかかります。
私が直面している問題はunsafe*IO*
、複数のスレッドから呼び出すことができる再入可能キャッシュを適切に (そしてチートを使用せずに) 実装し、同じ入力パラメーターに対する複数のクエリを単一の要求に結合する方法です。
私は、純粋な計算のための GHC のブラックホールの概念に似たものを求めていると思いますが、IO の「計算」のコンテキストにあります。
上記の問題に対する慣用的な Haskell/GHC ソリューションは何ですか?