Haskell数组索引超出范围



我的代码粘贴在这里。下面是我的ghci调试会话。我仍然不明白为什么当"len"绑定为90570时,它的范围是(0,-193459561)。

*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))

我怀疑索引超出范围异常不是由您认为的表达式引起的!

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

不会抛出任何异常,它只是给您一个空数组。还要注意最后一条调试消息中的列号:

在SVMCF停止。hs:125:60-86

60到86是map ((u,i,r) -> [u,i]) rts,它显然没有任何索引:映射中当然没有,第一个参数中也没有,rts看起来也很干净,因为它是通过Parsec直接从ua.base来的。

因为允许Haskell对其求值顺序相当自由,所以异常可能是由一个完全不同的表达式中的减少引发的。你确定你传递给SVM的所有其他东西都设置正确了吗?特别是,考虑到您使用的是Int索引数组,您确定在任何数组中都不会发生整数溢出吗?您的任何数据集,例如4101507735或8396475031记录长吗?因为这些数据集溢出到-193459561作为Int)。

GHCi调试器中的:history命令是否提供了更多信息?

最新更新