arrays - haskell 中是否有一个函数可以像 accumArray 和 foldr 一样工作?

标签 arrays haskell fold

让我调用函数 accumrArray。

accumrArray :: 
              (e' -> e -> e) An accumulating function
           -> e              A default element 
           -> (i, i)         The bounds of the array 
           -> [(i, e')]      List of associations 
           -> a i e          The array

accumrArray  (:) [] (1,2) [(1,1),(2,2),(2,3)]  === array [(1,[1]), (2,[2,3])]
head $ (accumrArray (:) [] (1,1) [(1,x)|x<-[4..]]) ! 1 === 4

最佳答案

真奇怪……我几天前为别人写了这个函数。该函数最初出现在 LML 中(我相信),但从未进入 Haskell 数组库。

给你:

{-# LANGUAGE ScopedTypeVariables #-}
import Data.Array
import System.IO.Unsafe
import Data.IORef
import Data.Array.MArray
import Data.Array.Base
import Control.Monad
import Data.Array.IO

accumArrayR :: forall a e i. Ix i => (a -> e -> e) -> e -> (i,i) -> [(i,a)] -> Array i e
accumArrayR f e bounds@(l,u) assocs = unsafePerformIO $ do
  ref <- newIORef assocs
  arr <- newArray_ bounds
  let _ = arr :: IOArray i e
  let n = safeRangeSize (l,u)
  let elem x = unsafePerformIO $ do
                  ass <- readIORef ref
                  let loop [] = writeIORef ref [] >> return e
                      loop ((y,a):rest) = do
                         let ix = safeIndex bounds n y
                         let r = f a (elem x)
                         unsafeWrite arr ix r
                         if (ix == x)
                            then writeIORef ref rest >> return r
                            else loop rest
                  loop ass
  forM_ [0..n] $ \ix -> unsafeWrite arr ix (elem ix)
  unsafeFreeze arr

读者的挑战:使用 accumArrayR 实现图的线性时间深度优先搜索。

编辑我应该提一下,该函数在编写时并不是线程安全的。将 IORef 变成 MVar 可以解决这个问题,但可能有更好的方法。

关于arrays - haskell 中是否有一个函数可以像 accumArray 和 foldr 一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4692972/

相关文章:

javascript - 如果包含特定单词,则从数组中返回匹配项

haskell - 在哪里可以找到所有 GHC 扩展的列表

haskell - Foldl 与 Foldr 内存使用情况

c++ - 使用模板元编程实现 std::all_of 的静态版本?

java - 斐波那契递归问题,无法返回 2 个元素

javascript - 从数组数组中删除

c - 声明指向数组的指针时,全局变量和局部变量有什么区别?

json - 来自 Haskell 的查询请求,包含 "same data"的两倍

haskell - 有没有办法在ghc中重载并置?

performance - Haskell - foldl' 在 foldr 和性能问题方面