想象这样一个函数:
bar :: Foo -> A -> B -> C -> IO ()
该函数IO使用 aFoo和其他值执行一些操作。该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,扩展 的参数bar,这很难看。