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