[Haskell-cafe] Bug in writeArray?

Bulat Ziganshin bulat.ziganshin at gmail.com
Wed Sep 23 11:36:41 EDT 2009

Hello Grzegorz,

Wednesday, September 23, 2009, 7:19:59 PM, you wrote:

> This seems like a bug in the implementation of writeArray: when passed
>   let (l,u) = ((0,10),(20,20))

writeArray computes raw index (from 0 to total number of array
elements) and check that this index is correct. with multi-dimensional
arrays this approach may lead to wrong results, as you mentioned. it's
known problem that isn't fixed for a long time probably due to
efficiency cautions. the error is here:

data Ix i => Array i e
                 = Array !i         -- the lower bound, l
                         !i         -- the upper bound, u
                         !Int       -- a cache of (rangeSize (l,u))
                                    -- used to make sure an index is
                                    -- really in range
                         (Array# e) -- The actual elements

(!) :: Ix i => Array i e -> i -> e
arr@(Array l u n _) ! i = unsafeAt arr $ safeIndex (l,u) n i

safeIndex :: Ix i => (i, i) -> Int -> i -> Int
safeIndex (l,u) n i = let i' = unsafeIndex (l,u) i
                      in if (0 <= i') && (i' < n)
                         then i'
                         else error "Error in array index"

obviously, safeIndex should use inRange call instead

Best regards,
 Bulat                            mailto:Bulat.Ziganshin at gmail.com

More information about the Haskell-Cafe mailing list