Подтвердить что ты не робот

Исключить границы массива Haskell для ограничения типа Bounded?

Я делаю много массивов, тип индекса которых Bounded и диапазон индексов которых (minBound, maxBound). Для такого массива проверка границ должна быть ненужной. Как я могу убедить GHC устранить проверку границ?

В моем конкретном приложении используются как ядро, так и unboxed неизменяемые массивы, но меня интересуют все типы массивов Haskell.

4b9b3361

Ответ 1

Импортируйте Data.Array.Base, вычислите индекс Int нужного элемента и используйте

someArray `unsafeAt` computedIndex

чтобы избежать проверки диапазона (unsafeRead и unsafeWrite для изменяемых массивов). Вычисление индекса Int без проверки диапазона должно быть доступно через unsafeIndex из класса Ix, если вы import GHC.Arr.

Если экземпляр Ix вашего типа индекса не обеспечивает быструю непроверенную функцию unsafeIndex, вы должны написать ее самостоятельно. Это может быть предпочтительным в любом случае, так как ваш диапазон (minBound, maxBound) является постоянным и его не нужно передавать в вычисление индекса.