Haskell IORef数组用法
我正在开发一个程序,该程序使用大量的Haskell IORef数组用法,haskell,data-structures,functional-programming,monads,ioref,Haskell,Data Structures,Functional Programming,Monads,Ioref,我正在开发一个程序,该程序使用大量的IORef来创建数据类型。执行此操作时,哪种内存/处理器效率更高: [IORef Foo] 或 忽略我使用列表而不是向量或数组的事实。使用[IORef Foo]可以轻松地更新元素,使用IORef[Foo]只能更新整个列表。由于您可能希望在不复制的情况下高效地更新元素,因此需要[IORef Foo]。想想看,你想要一个可变事物的列表,而不是一个不变事物的可变列表 例如 import Data.IORef makeTest :: IO [IORef Int]
IORef
来创建数据类型。执行此操作时,哪种内存/处理器效率更高:
[IORef Foo]
或
忽略我使用列表而不是向量或数组的事实。使用
[IORef Foo]
可以轻松地更新元素,使用IORef[Foo]
只能更新整个列表。由于您可能希望在不复制的情况下高效地更新元素,因此需要[IORef Foo]
。想想看,你想要一个可变事物的列表,而不是一个不变事物的可变列表
例如
import Data.IORef
makeTest :: IO [IORef Int]
makeTest = sequence [newIORef 0, newIORef 1, newIORef 2]
main = do
test <- makeTest
readIORef (test !! 1) >>= print
modifyIORef (test !! 1) (+1) -- Doesn't copy list
readIORef (test !! 1) >>= print
import Data.IORef
makeTest::IO[IORef Int]
makeTest=序列[newIORef 0,newIORef 1,newIORef 2]
main=do
测试>=打印
modifyIORef(test!!1)(+1)--不复制列表
readIORef(test!!1)>>=打印
另一方面,[IORef]允许您更改项目数量,而IORef[]不允许。因此,有一个建议:使用IORef[IORef]。您确定不希望使用IOArray
?
import Data.IORef
makeTest :: IO [IORef Int]
makeTest = sequence [newIORef 0, newIORef 1, newIORef 2]
main = do
test <- makeTest
readIORef (test !! 1) >>= print
modifyIORef (test !! 1) (+1) -- Doesn't copy list
readIORef (test !! 1) >>= print