Data.Array.IArray
| Авторские права | (c) The University of Glasgow 2001 |
|---|---|
| Лицензия | BSD-style (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | экспериментальная |
| Переносимость | непереносимый (использует Data.Array.Base) |
| Безопасный Haskell | Доверенный |
| Язык | Haskell2010 |
Описание
Неизменяемые массивы с перегруженным интерфейсом. Типы массивов, которые можно использовать с этим интерфейсом, см. в типе Array, экспортируемом этим модулем, и в модуле Data.Array.Unboxed. Другие пакеты, такие как diffarray, также предоставляют массивы с использованием этого интерфейса.
Классы массивов
class IArray (a :: Type -> Type -> Type) e Исходный код
Класс неизменяемых типов массивов.
Тип массива имеет форму (a i e), где a — конструктор типа массива (kind * -> * -> *), i — тип индекса (представитель класса Ix), а e — тип элемента. Класс IArray параметризован как по a, так и по e, поэтому можно определять экземпляры, специализированные для определённых типов элементов.
Минимальное полное определение
Экземпляры
Определён в Data.Array.Base Методыbounds :: Ix i => UArray i (StablePtr a) -> (i, i) Источник numElements :: Ix i => UArray i (StablePtr a) -> Int Источник unsafeArray :: Ix i => (i, i) -> [(Int, StablePtr a)] -> UArray i (StablePtr a) Источник unsafeAt :: Ix i => UArray i (StablePtr a) -> Int -> StablePtr a Источник unsafeReplace :: Ix i => UArray i (StablePtr a) -> [(Int, StablePtr a)] -> UArray i (StablePtr a) Источник unsafeAccum :: Ix i => (StablePtr a -> e' -> StablePtr a) -> UArray i (StablePtr a) -> [(Int, e')] -> UArray i (StablePtr a) Источник unsafeAccumArray :: Ix i => (StablePtr a -> e' -> StablePtr a) -> StablePtr a -> (i, i) -> [(Int, e')] -> UArray i (StablePtr a) Источник |
module Data.Ix
Неизменяемые нестрогие (боксированные) массивы
data Array i e
Экземпляры
| IArray Array e Источник | |
Определён в Data.Array.Base Методыbounds :: Ix i => Array i e -> (i, i) Источник numElements :: Ix i => Array i e -> Int Источник unsafeArray :: Ix i => (i, i) -> [(Int, e)] -> Array i e Источник unsafeAt :: Ix i => Array i e -> Int -> e Источник unsafeReplace :: Ix i => Array i e -> [(Int, e)] -> Array i e Источник unsafeAccum :: Ix i => (e -> e' -> e) -> Array i e -> [(Int, e')] -> Array i e Источник unsafeAccumArray :: Ix i => (e -> e' -> e) -> e -> (i, i) -> [(Int, e')] -> Array i e Источник | |
| Functor (Array i) | |
| Foldable (Array i) | |
Определён в GHC.Internal.Data.Foldable Методыfold :: Monoid m => Array i m -> m foldMap :: Monoid m => (a -> m) -> Array i a -> m foldMap' :: Monoid m => (a -> m) -> Array i a -> m foldr :: (a -> b -> b) -> b -> Array i a -> b foldr' :: (a -> b -> b) -> b -> Array i a -> b foldl :: (b -> a -> b) -> b -> Array i a -> b foldl' :: (b -> a -> b) -> b -> Array i a -> b foldr1 :: (a -> a -> a) -> Array i a -> a foldl1 :: (a -> a -> a) -> Array i a -> a elem :: Eq a => a -> Array i a -> Bool maximum :: Ord a => Array i a -> a minimum :: Ord a => Array i a -> a | |
| Ix i => Traversable (Array i) | |
| (Ix i, Eq e) => Eq (Array i e) | |
| (Ix i, Ord e) => Ord (Array i e) | |
Определён в GHC.Internal.Arr | |
| (Ix a, Read a, Read b) => Read (Array a b) | |
| (Ix a, Show a, Show b) => Show (Array a b) | |
Создание массивов
Аргументы
| :: (IArray a e, Ix i) | |
| => (i, i) | границы массива: (нижняя,верхняя) |
| -> [(i, e)] | список ассоциаций |
| -> a i e |
Создаёт неизменяемый массив на основе пары границ и списка начальных ассоциаций.
Границы задаются парой нижней и верхней границ массива соответственно. Например, вектор длины 10 с индексацией от единицы имеет границы (1,10), а матрица размером 10 на 10 с индексацией от единицы — границы ((1,1),(10,10)).
Ассоциация — это пара вида (i,x), которая задаёт значение массива по индексу i равным x. Массив не определён, если какой-либо индекс в списке находится вне границ. Если у нескольких ассоциаций в списке одинаковый индекс, значение по этому индексу зависит от реализации. (В GHC используется последнее заданное значение для этого индекса. Другие реализации также поступают так для боксированных массивов, но Haskell 98 требует, чтобы для Array значением по таким индексам было bottom.)
Поскольку индексы необходимо проверять на наличие этих ошибок, array является строгой по аргументу границ и индексам списка ассоциаций. Строгость или нестрогость array по элементам зависит от типа массива: Array — нестрогий тип массива, а все массивы UArray являются строгими. Поэтому в нестрогом массиве возможны такие рекурсивные определения:
a = array (1,100) ((1,1) : [(i, i * a!(i-1)) | i \<- [2..100]])
В списке ассоциаций не обязательно указывать каждый индекс в границах массива, но значения, связанные с неуказанными индексами, будут неопределёнными.
Если в каком-либо измерении нижняя граница больше верхней, массив допустим, но пуст. Обращение по индексу к пустому массиву всегда приводит к ошибке выхода за границы, но bounds по-прежнему возвращает границы, с которыми был создан массив.
listArray :: (IArray a e, Ix i) => (i, i) -> [e] -> a i e Источник
Создаёт неизменяемый массив из списка начальных элементов. Список задаёт элементы массива в порядке возрастания, начиная с наименьшего индекса.
Аргументы
| :: (IArray a e, Ix i) | |
| => (e -> e' -> e) | Функция накопления |
| -> e | Элемент по умолчанию |
| -> (i, i) | Границы массива |
| -> [(i, e')] | Список ассоциаций |
| -> a i e | Возвращает: массив |
Создаёт неизменяемый массив из списка ассоциаций. В отличие от array, в списке ассоциаций один и тот же индекс может встречаться несколько раз; для объединения значений элементов с одинаковым индексом используется функция накопления.
Например, если дан список значений некоторого типа индекса, hist строит гистограмму количества вхождений каждого индекса в заданном диапазоне:
hist :: (Ix a, Num b) => (a,a) -> [a] -> Array a b hist bnds is = accumArray (+) 0 bnds [(i, 1) | i\<-is, inRange bnds i]
genArray :: (IArray a e, Ix i) => (i, i) -> (i -> e) -> a i e Источник
Создаёт неизменяемый массив с помощью функции-генератора.
Начиная с: array-0.5.6.0
Доступ к массивам
(!) :: (IArray a e, Ix i) => a i e -> i -> e Источник
Возвращает элемент неизменяемого массива по указанному индексу или выбрасывает исключение, если индекс находится вне границ массива.
(!?) :: (IArray a e, Ix i) => a i e -> i -> Maybe e Источник
Возвращает Just элемент неизменяемого массива по указанному индексу или Nothing, если индекс находится вне границ массива.
Начиная с: array-0.5.6.0
bounds :: (IArray a e, Ix i) => a i e -> (i, i) Источник
Извлекает границы неизменяемого массива
indices :: (IArray a e, Ix i) => a i e -> [i] Источник
Возвращает список всех допустимых индексов массива.
elems :: (IArray a e, Ix i) => a i e -> [e] Источник
Возвращает список всех элементов массива в том же порядке, что и их индексы.
assocs :: (IArray a e, Ix i) => a i e -> [(i, e)] Источник
Возвращает содержимое массива в виде списка ассоциаций.
Свёртки массивов
foldrArray :: (IArray a e, Ix i) => (e -> b -> b) -> b -> a i e -> b Источник
Ленивое правоассоциативное свёртывание.
Начиная с: array-0.5.8.0
foldlArray' :: (IArray a e, Ix i) => (b -> e -> b) -> b -> a i e -> b Источник
Строгое накапливающее левоассоциативное свёртывание.
Начиная с: array-0.5.8.0
foldlArray :: (IArray a e, Ix i) => (b -> e -> b) -> b -> a i e -> b Источник
Ленивое левоассоциативное свёртывание.
Начиная с: array-0.5.8.0
foldrArray' :: (IArray a e, Ix i) => (e -> b -> b) -> b -> a i e -> b Источник
Строгое накапливающее правоассоциативное свёртывание.
Начиная с: array-0.5.8.0
traverseArray_ :: (IArray a e, Ix i, Applicative f) => (e -> f b) -> a i e -> f () Источник
Преобразует элементы в аппликативные действия, выполняет их последовательно слева направо и отбрасывает результаты.
Начиная с: array-0.5.8.0
forArray_ :: (IArray a e, Ix i, Applicative f) => a i e -> (e -> f b) -> f () Источник
forArray_ — это traverseArray_ с переставленными аргументами.
Начиная с: array-0.5.8.0
foldlArrayM' :: (IArray a e, Ix i, Monad m) => (b -> e -> m b) -> b -> a i e -> m b Источник
Строгое накапливающее левоассоциативное монадическое свёртывание.
Начиная с: array-0.5.8.0
foldrArrayM' :: (IArray a e, Ix i, Monad m) => (e -> b -> m b) -> b -> a i e -> m b Источник
Строгое накапливающее правоассоциативное монадическое свёртывание.
Начиная с: array-0.5.8.0
Инкрементальное обновление массивов
(//) :: (IArray a e, Ix i) => a i e -> [(i, e)] -> a i e Источник
Принимает массив и список пар и возвращает массив, идентичный левому аргументу, но обновлённый ассоциациями из правого аргумента. Например, если m — матрица n на n с нумерацией от 1, то m//[((i,i), 0) | i <- [1..n]] — та же матрица, но с нулями на диагонали.
Как и для функции array, если у двух ассоциаций в списке совпадают индексы, значение по этому индексу зависит от реализации. (В GHC используется последнее указанное значение для этого индекса. Другие реализации также поступают так для массивов без указателей, но Haskell 98 требует, чтобы для Array значение по таким индексам было bottom.)
Для большинства типов массивов эта операция выполняется за O(n), где n — размер массива. Однако пакет diffarray предоставляет тип массива, для которого сложность этой операции линейна относительно числа обновлений.
accum :: (IArray a e, Ix i) => (e -> e' -> e) -> a i e -> [(i, e')] -> a i e Источник
accum f принимает массив и список ассоциаций и накапливает в массиве пары из списка с помощью накапливающей функции f. Таким образом, accumArray можно определить с помощью accum:
accumArray f z b = accum f (array b [(i, z) | i \<- range b])
Производные массивы
amap :: (IArray a e', IArray a e, Ix i) => (e' -> e) -> a i e' -> a i e Источник
Возвращает новый массив, полученный из исходного применением функции к каждому элементу.
ixmap :: (IArray a e, Ix i, Ix j) => (i, i) -> (i -> j) -> a j e -> a i e Источник
Возвращает новый массив, полученный из исходного применением функции к каждому индексу.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/array-0.5.8.0-93e8/Data-Array-IArray.html