Вот навелосипедил:
## Код:
```
module Indexes (Index, incArray, test) where

data Index = Index { dwnBound :: Int, value :: Int, upBound :: Int} deriving Show

add n idx@(Index d v u) = ( (v'+n) `div` (u'+1),
                            idx {value = (v'+n) `mod` (u'+1) + d} )
    where d' = 0
          v' = v-d
          u' = u-d

incArray idxs = idxs'
    where (_,idxs') = foldl (\(a,ix) i -> case (add a i) of (a',i') -> (a',i':ix)) 
                            (1,[]) 
                            (reverse idxs)    

test = incArray [Index 0 8 9, Index 0 9 9]
```


Пойду теперь гляну как это сделано в стандартной либе