【发布时间】:2014-09-04 09:24:36
【问题描述】:
想象一下这样的功能:
bar :: Foo -> A -> B -> C -> IO ()
该函数使用Foo 和其他值执行一些IO 的东西。 Foo 值必须传递给 bar,并且可以通过以下方式从 IO 检索:
foo :: X -> IO Foo
现在,A、B、C 和 X 都是纯纯值。我更喜欢这样的bar函数:
bar :: X -> A -> B -> C -> IO ()
而Foo 将使用X 值在bar 函数中生成。如果我这样做:
let f = bar myX
f :: A -> B -> C -> IO ()。如果我多次调用该函数,X 的值由于部分应用而保持不变,但由于它是IO 效果,因此每次都会生成它。是否有一种 native、built-in-ghc 方式来执行某种缓存,以便为生成的闭包生成一次 Foo 值?我想这都是与拳击有关的,但我一直不知道如何在不使用脏 IORef 的情况下做到这一点,扩展 bar 的参数,这很难看。
【问题讨论】:
标签: haskell caching closures partial-application