そのような関数を想像してください:
bar :: Foo -> A -> B -> C -> IO ()
その関数は、 aおよびその他の値IOを使用していくつかのことを実行します。値は に渡す必要があり、次Fooの方法で取得できます。FoobarIO
foo :: X -> IO Foo
現在、A、B、CおよびXはすべて単純な純粋な値です。私はむしろそのようなbar機能が欲しいです:
bar :: X -> A -> B -> C -> IO ()
そして、値を使用して関数Fooで生成されます。私がそれを行う場合:barX
let f = bar myX
f :: A -> B -> C -> IO (). その関数を何回か呼んでもX部分適用で値は変わらないのですが、IO効果なので毎回発生してしまいます。生成されたクロージャに対して、値が一度生成されるように、ある種のキャッシュを実行するネイティブの組み込みの ghc の方法はありますか? Fooそれはすべてボクシングに関連していると思いますが、IORefのパラメーターを展開するdirty を使用せずにそれを行う方法がわかりませんでしbarた。これは醜いです。