arrays - Haskell 可变结构与不可变 Shell

标签 arrays haskell io monads space

我对 Haskell 还很陌生,所以非常感谢您的帮助!

我正在使用 IOArray 来更新恒定空间中的随机元素。我有一个如下所示的包装:

data W = W{ arr::IO (IOArray Int Node), n::Int, ... }

但是,我找不到更新 arr 的方法,以便在传递包装器时它是可见的,而不需要执行 wrappper{arr = x} 之类的操作,这会浪费大量GC时间。在测试中,结果证明它太慢了。

有没有办法更新arr,使其全局可见?谢谢!

最佳答案

这是如何使用 ST 数组的快速示例

import Data.Array.ST hiding (unsafeThaw) -- Deprecated
import Data.Array (Array)
import Data.Array.Unsafe (unsafeThaw) -- If you really really really need it

newtype W a = W {arr :: Array Integer a}

modifyW :: a -> W a -> W a
modifyW v (W arr) = W $ runSTArray $ do -- The double $ is on purpose, . doesn't
                                        -- play so well with Rank n types.
  a <- thaw arr -- Turn `arr` into something we can modify
  writeArray a 1 v -- modify it
  return a

这将确保计算是纯粹的,但数组不会在modifyW内复制,所有这些修改都是恒定时间。如果您根本无力承担任何复制费用,您可以使用unsafeThaw。但这很好..不安全。它实际上会修改纯数组,因此您必须非常小心,不要在运行 modifyW 后尝试使用纯结构。由于惰性评估,这比听起来要困难得多,因此我警告您不要这样做。

使用这种风格,您可以从纯Array中读取,然后当您需要修改它时,您可以在ST monad中运行,这让您可以做不纯粹的事情,但是不会让它们渗透到程序的其余部分。

关于arrays - Haskell 可变结构与不可变 Shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19981685/

相关文章:

java - 检查所有数组值是否不同

Javascript 输出缓冲区将内容放置在错误的顺序中

javascript - 在 JavaScript 中组合对象数组以形成一个新的数组

haskell - 打印一些东西的递归函数

linux - 如何根据 'sys_seek' 计算 'sys_read'?

c - C 中的结构内部列表 - 显示链接列表中存在的结构的成员

javascript - Angular/ meteor : Array is undefined

haskell - 快照 : wrapping auth handler with CSRF checker

haskell - 在 yesod 中以类型安全的方式指定 favicon

android - 无法访问 SD 卡