module Ix ( Ix(range, index, inRange, rangeSize) ) where class Ord a => Ix a where range :: (a,a) -> [a] index :: (a,a) -> a -> Int inRange :: (a,a) -> a -> Bool rangeSize :: (a,a) -> Int instance Ix Char where ... instance Ix Int where ... instance Ix Integer where ... instance (Ix a, Ix b) => Ix (a,b) where ... -- и так далее instance Ix Bool where ... instance Ix Ordering where ... |
Реализация имеет право предполагать выполнение следующих правил относительно этих
операций:
range (l,u) !! index (l,u) i == i -- когда i находится в указанном диапазоне
inRange (l,u) i == i `elem` range (l,u)
map index (range (l,u)) == [0..rangeSize (l,u)]
Есть возможность вывести (произвести) экземпляр класса Ix автоматически, используя инструкцию deriving в объявлении data (раздел 4.3.3). Объявления таких производных экземпляров класса Ix возможны только для перечислений (т.е. типов данных, имеющих конструкторы без аргументов) и типов данных с одним конструктором, у которого компоненты имеют типы, являющиеся экземплярами класса Ix. Реализация Haskell должна обеспечить экземпляры класса Ix для кортежей по меньшей мере вплоть до 15 размера.