gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:49:13 25 4
gpt4 key购买 nike

让我调用函数 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/

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