2012-07-10 39 views
13

我制作了很多索引类型为Bounded,索引范围为(minBound, maxBound)的阵列。对于这样的数组,边界检查应该是不必要的。我如何说服GHC消除边界检查?消除Haskell数组边界检查有界类型?

我的特定应用同时使用装箱和取消装箱不变的数组,但我感兴趣的各类哈斯克尔阵列。

+2

那么,它是什么数组类型?它只是'Data.Array.IArray'? – 2012-07-10 11:13:04

回答

13

导入Data.Array.Base,计算Int索引所需的元件,并且使用

someArray `unsafeAt` computedIndex 

避免范围校验(unsafeReadunsafeWrite为可变阵列)。在Int指数无范围检查计算应通过unsafeIndex可从Ix类,如果你import GHC.Arr

如果您的索引类型的Ix实例未提供快速未经检查的unsafeIndex函数,则必须自己编写它。无论如何,这可能是更可取的,因为你的范围(minBound, maxBound)是常量,不需要传递给索引计算。