Haskell数组索引超出范围

Jam*_*mes 17 arrays haskell range

我的代码粘贴在这里.下面是我的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))
Run Code Online (Sandbox Code Playgroud)

Dav*_*ner 3

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

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

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

停在 SVMCF.hs:125:60-86

60 到 86 显然map (\(u,i,r) -> [u,i]) rts没有任何索引:map 中当然没有,它的第一个参数也没有,而且rts看起来也很干净,因为它直接来自于ua.baseParsec。

由于 Haskell 的求值顺序可以相当自由,因此完全不同的表达式的约简可能会引发异常。您确定传递给 SVM 的所有其他内容都设置正确吗?特别是,考虑到您使用的Int是索引数组,您确定任何数组中都没有发生整数溢出吗?您的任何数据集(例如 4101507735 或 8396475031 记录)是否很长,因为这些记录溢出到 -193459561(如Int)。

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