假设我们有一个IO动作如折返缓存调用
lookupStuff :: InputType -> IO OutputType
这可能是简单的东西,如DNS查找,或对不随时间变化数据的一些Web服务调用。
让我们假设:
操作不会抛出任何异常和/或从未发散
如果不是为
IO
单子,该功能将是纯的,即结果对于相同的输入参数总是相同的该操作是可重入的,即它可以安全地从多个线程同时调用。
lookupStuff
操作相当(时间)昂贵。
我面临的问题是如何正确(和W/O使用任何unsafe*IO*
作弊)实现重入缓存中,可以从多个线程调用,组合多个查询,对于相同的输入参数整合成一个请求。
我想我是在类似于GHC的黑洞概念纯粹的计算,但在IO“计算”的上下文。
什么是指定问题的惯用Haskell/GHC解决方案?
的假设1 ,2和3似乎意味着该功能非常纯粹,杂质仅仅是一个实现细节。在这种情况下,我认为使用unsafePerformIO没有任何问题。实际上,我认为unsafePerformIO完全适用于这种情况。 – 2011-03-30 10:30:43
同意。 1,2,3是非常强大的假设,在IO中几乎从不保存代码,但是如果事实上可以保证这个不安全的PerformaIO是相当合理的。 – 2011-03-30 10:45:01
好吧,但我如何保证IO效果从来不会为相同的输入参数执行多次? – hvr 2011-03-30 10:48:07