Индекс массива Haskell вне диапазона - PullRequest
17 голосов
/ 05 июня 2011

Мой код вставлен сюда .Ниже мой сеанс отладки 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))

1 Ответ

3 голосов
/ 05 августа 2011

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

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 -индексированные массивы, вы уверены, что в любом массиве нет целочисленного переполнения? Являются ли какие-либо из ваших наборов данных длиной, например, 4101507735 или 8396475031 записей, поскольку они переполняются до -193459561 как Int).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...