想象这样一个函数:
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
,这很难看。