Подтвердить что ты не робот

Индекс массива Haskell вне диапазона

Мой код вставлен здесь. Ниже приведена моя отладочная сессия ghci. Я до сих пор не понимаю, почему он имеет диапазон (0, -193459561), когда привязка "len" составляет 90570.

*Main> :break 125
Breakpoint 4 activated at SVMCF.hs:125:13-86
*Main> :trace main
Stopped at SVMCF.hs:125:13-86
_result :: UA.Array Int [User] = _
len :: Int = 90570
rts :: [RTuple] = (1,1,5.0) : (1,2,3.0) : (1,3,4.0) : (1,4,3.0) :
                  (1,5,3.0) : ....
[SVMCF.hs:125:13-86] *Main> :lis
124      points :: A.Array Int [Int]
125      points = assert (len > 0) $ A.listArray (1::Int, len) $ map (\(u,i,r) -> [u,i]) rts
126      values :: UA.UArray Int Double
[SVMCF.hs:125:13-86] *Main> :ste
Stopped at SVMCF.hs:125:13-28
_result :: UA.Array Int [User] -> UA.Array Int [User] = _
len :: Int = 90570
[SVMCF.hs:125:13-28] *Main> :ste
Stopped at SVMCF.hs:125:21-27
_result :: Bool = _
len :: Int = 90570
[SVMCF.hs:125:21-27] *Main> :ste
Stopped at SVMCF.hs:125:32-86
_result :: UA.Array Int [User] = _
len :: Int = 90570
rts :: [RTuple] = (1,1,5.0) : (1,2,3.0) : (1,3,4.0) : (1,4,3.0) :
                  (1,5,3.0) : ....
[SVMCF.hs:125:32-86] *Main> :ste
Stopped at SVMCF.hs:125:32-56
_result :: [[User]] -> UA.Array Int [User] = _
len :: Int = 90570
[SVMCF.hs:125:32-56] *Main> :lis
124      points :: A.Array Int [Int]
125      points = assert (len > 0) $ A.listArray (1::Int, len) $ map (\(u,i,r) -> [u,i]) rts
126      values :: UA.UArray Int Double
[SVMCF.hs:125:32-56] *Main> len
90570
[SVMCF.hs:125:32-56] *Main> :ste
Stopped at SVMCF.hs:125:60-86
_result :: [[User]] = _
rts :: [RTuple] = (1,1,5.0) : (1,2,3.0) : (1,3,4.0) : (1,4,3.0) :
                  (1,5,3.0) : ....
[SVMCF.hs:125:60-86] *Main> :ste
*** Exception: Ix{Int}.index: Index (1) out of range ((1,-193459561))
4b9b3361

Ответ 1

Я подозреваю, что исключение из диапазона исключений не вызвано в выражении, которое вы так думаете!

Data.Array.listArray(1, -10) [2,3,4,5]

не вызывает никаких исключений, он просто дает вам пустой массив. Также обратите внимание на номера столбцов в последнем отладочном сообщении:

Остановлен на SVMCF.hs: 125: 60-86

от 60 до 86 map (\(u,i,r) -> [u,i]) rts, который, очевидно, не имеет в себе никакого индексации: в нем нет ни одного на карте, ни в его первом аргументе, а rts тоже выглядит чисто, как это происходит прямо из ua.base через Parsec.

Так как Haskell разрешено быть достаточно свободным с его порядком оценки, возможно, что исключение порождается уменьшением совершенно другого выражения. Вы уверены, что все другие вещи, которые вы передаете в SVM, настроены правильно? В частности, учитывая, что вы используете массивы Int -indexed, уверены ли вы, что в любом массиве нет целочисленного переполнения? Являются ли какие-либо из ваших наборов данных, например, 4101507735 или 8396475031, длинными, потому что они переполняются до -193459561 как Int).

Предоставляет ли команда :history в отладчике GHCi дополнительную информацию?