Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell IORef数组用法_Haskell_Data Structures_Functional Programming_Monads_Ioref - Fatal编程技术网

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