我正在创建许多索引类型为Bounded
且索引范围为(minBound, maxBound)
的数组。对于这样的数组,边界检查应该是不必要的。我如何说服GHC消除边界检查?
我的特定应用程序使用盒装和非盒装不可变数组,但我对所有类型的Haskell数组感兴趣。
答案 0 :(得分:14)
导入Data.Array.Base
,计算所需元素的Int
索引,然后使用
someArray `unsafeAt` computedIndex
避免范围检查(unsafeRead
和unsafeWrite
为可变数组。如果您Int
,unsafeIndex
类可以通过Ix
提供无范围检查的import GHC.Arr
索引的计算。
如果索引类型的Ix
实例未提供快速未经检查的unsafeIndex
函数,则必须自行编写。无论如何,这可能是更可取的,因为您的范围(minBound, maxBound)
是常量,不需要传递给索引计算。