Data.Array.IArray
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддерживающий | libraries@haskell.org |
| Стабильность | экспериментальная |
| Переносимость | непереносимая (использует Data.Array.Base) |
| Safe Haskell | Достоверный |
| Язык | Haskell2010 |
Описание
Неизменяемые массивы с перегруженным интерфейсом. Для типов массивов, которые могут использоваться с этим интерфейсом, см. тип Array экспортированный этим модулем и модуль Data.Array.Unboxed. Другие пакеты, такие как diffarray, также предоставляют массивы с использованием этого интерфейса.
Классы массивов
class IArray (a :: Тип -> Тип -> Тип) e Исходный код
Класс неизменяемых типов массивов.
Тип массива имеет вид (a i e) , где a — конструктор типа массива (вид * -> * -> *), i — тип индекса (член класса Ix), а e — тип элемента. Класс IArray параметризован как по a, так и по e, чтобы можно было определять специализированные экземпляры для определенных типов элементов.
Минимальное полное определение
Примеры реализации
module Data.Ix
Неизменяемые ленивые (упакованные) массивы
data Массив 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 a, Read a, Read b) => Read (Array a b) | |
| (Ix a, Show a, Show b) => Show (Массив a b) | |
| (Ix i, Eq e) => Eq (Массив i e) | |
| (Ix i, Ord e) => Ord (Массив i e) | |
Создание массивов
Аргументы
| :: (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 значение в таких индексах было неопределённым.)
Поскольку индексы должны быть проверены на эти ошибки, 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 — матрица 1-происхождения n×n, то 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.12.1/docs/libraries/array-0.5.8.0-8d84/Data-Array-IArray.html