我有一个最好描述为向量上的迭代突变的计算;最终结果是向量的最终状态。
我认为,使这个功能化的“惯用”方法是在“修改”时简单地传递一个新的向量对象。所以你的迭代方法是operate_on_vector :: Vector -> Vector
,它接受一个向量并输出修改后的向量,然后再次通过该方法馈送。
这种方法非常简单,即使是 Haskell 的新手,我也可以毫无问题地实现它。
或者,可以将所有这些封装在一个State
monad 中,并传递一个不断重新创建和修改的向量作为状态值。
然而,我遭受了巨大的性能成本,因为这些计算非常密集,迭代次数很多(大约数百万)并且数据向量可能会变得非常大(至少有数千个基元的数量级)。在迭代的每一步都在内存中重新创建一个新向量似乎非常昂贵,无论是否收集数据。
然后我考虑了它是如何IO
工作的——它基本上可以看作是State
,除了状态值是“世界”,它是不断变化的。
也许我可以使用类似于IO
在“世界”上“操作”的东西?而“世界”将是内存中的向量?有点像数据库查询,但一切都在内存中。
例如用 io 你可以做
do
putStrLn "enter something"
something <- getLine
putStrLine $ "you entered " ++ something
这可以看作是“执行”putStrLn
和“修改” World 对象,返回一个新的 World 对象并将其输入到 next 函数中,该函数在 world 对象中查询作为修改结果的字符串,然后返回另一个世界再次修改后的对象。
有没有类似的东西可以为可变向量做到这一点?
do
putInVec 0 9 -- index 0, value 9
val <- getFromVec 0
putInVec 0 (val + 1)
,使用“不纯”“可变”向量,而不是在每一步传递一个新的修改向量。