我一直在寻找Data.MemoCombinators的来源,但我无法真正看到它的核心位置.
请向我解释所有这些组合器背后的逻辑以及它们如何在实际编程中加速您的程序实际工作的机制.
我正在寻找这个实现的细节,并可选择与其他Haskell方法进行比较/对比来进行memoization.我理解什么是memoization,而不是在寻找它的工作原理.
假设我们有一个IO动作,如
lookupStuff :: InputType -> IO OutputType
Run Code Online (Sandbox Code Playgroud)
这可能是简单的东西,如DNS查找,或一些针对时间不变数据的Web服务调用.
我们假设:
该操作从不抛出任何异常和/或从不发散
如果不是IOmonad,则函数将是纯函数,即对于相等的输入参数,结果总是相同的
该操作是可重入的,即可以安全地同时从多个线程调用它.
该lookupStuff操作非常(时间)昂贵.
我面临的问题是如何正确(并且不使用任何unsafe*IO*作弊)实现可以从多个线程调用的可重入缓存,并将针对相同输入参数的多个查询合并为单个请求.
我想我正在追求类似于GHC的黑洞概念,用于纯计算,但在IO"计算"环境中.
对于所述问题,什么是惯用的Haskell/GHC解决方案?
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西:
IORef a -> IORef a -> IO Bool
Run Code Online (Sandbox Code Playgroud)
例如,如果您想可视化由 IORef 组成的图形,这将非常有用。我不认为它会破坏引用透明度,因为 IORefs 有一个有意义的身份(结果可能是在 IO 中,无论如何)。而且我认为作为指针比较,有效地实现这一点并不难。
这在某处可用吗?或者如果没有,为什么不呢?
(编辑:我刚刚从不同的 SO question 中找到System.Mem.StableName,这看起来很有帮助。)