gpt4 book ai didi

arrays - 具有不可变外壳的 Haskell 可变结构

转载 作者:行者123 更新时间:2023-12-04 04:34:30 24 4
gpt4 key购买 nike

我对 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 可变结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19981685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com