消除Haskell数组边界检查有界类型?

时间:2012-07-10 10:54:40

标签: arrays haskell ghc bounds-check-elimination

我正在创建许多索引类型为Bounded且索引范围为(minBound, maxBound)的数组。对于这样的数组,边界检查应该是不必要的。我如何说服GHC消除边界检查?

我的特定应用程序使用盒装和非盒装不可变数组,但我对所有类型的Haskell数组感兴趣。

1 个答案:

答案 0 :(得分:14)

导入Data.Array.Base,计算所需元素的Int索引,然后使用

someArray `unsafeAt` computedIndex

避免范围检查(unsafeReadunsafeWrite为可变数组。如果您IntunsafeIndex类可以通过Ix提供无范围检查import GHC.Arr索引的计算。

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