haskell - IO 中的就地更新
问题描述
为了提高效率,是否有(低级)GHC 功能允许就地更新 中的特定构造函数/记录字段IORef
?
给定以下代码:
data Object = Object {
field1 :: Int
field2 :: VeryLargeDataType
}
main :: IO ()
main = do
var <- newIORef
writeIORef var $ Object {
field1 = 42,
field2 = lotsOfData
}
modifyIORef var (\a -> a { field1 = (field1 a + 1) } )
...
GHC 将读出非常大的对象,执行微不足道的修改,然后将其写回。
从理论上讲,仅对字段进行就地更新就足够了,而且效率更高。
是否有任何 GHC 功能,例如低级原语,可以让我为任何ADT 执行此操作?
我知道特殊情况的解决方案是使字段IORef
s 而不是结构,但我正在寻找一种方法来使用任何结构,包括来自库的结构。
解决方案
没有这样的功能。一般来说,这也是不安全的:就地修改该大对象意味着以前从引用中读取的任何人现在都将具有与以前不同的值。(当然可能存在安全的受限情况。但我敢打赌,情况比你想象的要少。)
您可能也有兴趣阅读或注册此语言提案的更新。