2012-06-04 58 views
3

下面是一些在ideone处执行边界检查的代码。unsafeRead导致堆栈溢出

它成功运行,没有超出界限的错误。

this代码,在线34我已经在readArray更改为unsafeRead,它仍然编译,但崩溃堆栈溢出。

这是一个GHC错误还是我做错了什么?

回答

7

unsafeRead使用0为基础的指数,所以你必须要么调整用于读取的索引,

elem <- unsafeRead arr (i-1) 

,或者更好地,具有0

arr <- newArray (0,upperbound) maxBound 

作为至少索引分配阵列是,unsafeRead从数组中的错误位置读取。

无关:我怀疑ideone使用32位GHC,所以最好不要在那里运行代码upperbound > 100000

+0

还要注意''unsafeRead'需要一个Int,而'readArray'需要一个'Ix',这应该是一个小技巧...... – sclv