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

15

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

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


2
那么,它是什么类型的数组?只是 Data.Array.IArray 吗? - Louis Wasserman
1个回答

14

导入 Data.Array.Base 模块,计算所需元素的 Int 索引,然后使用该索引获取元素。

someArray `unsafeAt` computedIndex

为避免范围检查(对于可变数组使用unsafeReadunsafeWrite),可以使用Ix类中的unsafeIndex计算Int索引而无需进行范围检查。如果您import GHC.Arr,则应该能够使用此方法。如果您的索引类型的Ix实例没有提供快速的未经检查的unsafeIndex函数,则必须自行编写。这种情况可能更可取,因为您的范围(minBound,maxBound)是常数,无需将其传递给索引计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接