Data.Array.IArray
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | экспериментальная |
| Переносимость | непереносимая (использует Data.Array.Base) |
| Безопасный Haskell | Достоверный |
| Язык | Haskell2010 |
Описание
Неизменяемые массивы с перегруженным интерфейсом. Для типов массивов, которые могут использоваться с этим интерфейсом, см. тип Array экспортированный этим модулем и модуль Data.Array.Unboxed. Другие пакеты, такие как diffarray, также предоставляют массивы с использованием этого интерфейса.
Классы массивов
class IArray a e Исходный код
Класс неизменяемых типов массивов.
Тип массива имеет вид (a i e) , где a — конструктор типа массива (вид * -> * -> *), i — тип индекса (член класса Ix), а e — тип элементов. Класс IArray параметризован как по a, так и по e, чтобы можно было определять экземпляры, специализированные для определённых типов элементов.
Минимальное полное определение
границы, numElements, unsafeArray, unsafeAt
Экземпляры
| 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 | |
| IArray UArray Bool | |
Определено в Data.Array.Base Методыbounds :: Ix i => UArray i Bool -> (i, i) Источник numElements :: Ix i => UArray i Bool -> Int unsafeArray :: Ix i => (i, i) -> [(Int, Bool)] -> UArray i Bool unsafeAt :: Ix i => UArray i Bool -> Int -> Bool unsafeReplace :: Ix i => UArray i Bool -> [(Int, Bool)] -> UArray i Bool unsafeAccum :: Ix i => (Bool -> e' -> Bool) -> UArray i Bool -> [(Int, e')] -> UArray i Bool unsafeAccumArray :: Ix i => (Bool -> e' -> Bool) -> Bool -> (i, i) -> [(Int, e')] -> UArray i Bool | |
| IArray UArray Char | |
Определено в Data.Array.Base Методыbounds :: Ix i => UArray i Char -> (i, i) Источник numElements :: Ix i => UArray i Char -> Int unsafeArray :: Ix i => (i, i) -> [(Int, Char)] -> UArray i Char unsafeAt :: Ix i => UArray i Char -> Int -> Char unsafeReplace :: Ix i => UArray i Char -> [(Int, Char)] -> UArray i Char unsafeAccum :: Ix i => (Char -> e' -> Char) -> UArray i Char -> [(Int, e')] -> UArray i Char unsafeAccumArray :: Ix i => (Char -> e' -> Char) -> Char -> (i, i) -> [(Int, e')] -> UArray i Char | |
| IArray UArray Double | |
Определено в 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) | |
| IArray UArray (Ptr a) | |
Определено в Data.Array.Base Методыbounds :: Ix i => UArray i (Ptr a) -> (i, i) Источник numElements :: Ix i => UArray i (Ptr a) -> Int unsafeArray :: Ix i => (i, i) -> [(Int, Ptr a)] -> UArray i (Ptr a) unsafeAt :: Ix i => UArray i (Ptr a) -> Int -> Ptr a unsafeReplace :: Ix i => UArray i (Ptr a) -> [(Int, Ptr a)] -> UArray i (Ptr a) unsafeAccum :: Ix i => (Ptr a -> e' -> Ptr a) -> UArray i (Ptr a) -> [(Int, e')] -> UArray i (Ptr a) unsafeAccumArray :: Ix i => (Ptr a -> e' -> Ptr a) -> Ptr a -> (i, i) -> [(Int, e')] -> UArray i (Ptr a) | |
| IArray UArray (FunPtr a) | |
Определено в Data.Array.Base Методыbounds :: Ix i => UArray i (FunPtr a) -> (i, i) Исходный код numElements :: Ix i => UArray i (FunPtr a) -> Целое unsafeArray :: Ix i => (i, i) -> [(Целое, FunPtr a)] -> UArray i (FunPtr a) unsafeAt :: Ix i => UArray i (FunPtr a) -> Целое -> FunPtr a unsafeReplace :: Ix i => UArray i (FunPtr a) -> [(Целое, FunPtr a)] -> UArray i (FunPtr a) unsafeAccum :: Ix i => (FunPtr a -> e' -> FunPtr a) -> UArray i (FunPtr a) -> [(Целое, e')] -> UArray i (FunPtr a) unsafeAccumArray :: Ix i => (FunPtr a -> e' -> FunPtr a) -> FunPtr a -> (i, i) -> [(Целое, e')] -> UArray i (FunPtr a) |
module Data.Ix
Неизменяемые нестрогие (упакованные) массивы
data Массив i e Исходный код
Тип неизменяемых нестрогих (упакованных) массивов с индексами в i и элементами в e.
Экземпляры
| IArray Array e | |
Определено в Data.Array.Base Методыbounds :: Ix i => Array i e -> (i, i) Source 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) | С момента версии: base-2.1 |
| Foldable (Array i) | С момента версии: base-4.8.0.0 |
Определено в Data.Foldable Методыfold :: Monoid m => Array i m -> m Source foldMap :: Monoid m => (a -> m) -> Array i a -> m Source foldMap' :: Monoid m => (a -> m) -> Array i a -> m Source foldr :: (a -> b -> b) -> b -> Array i a -> b Source foldr' :: (a -> b -> b) -> b -> Array i a -> b Source foldl :: (b -> a -> b) -> b -> Array i a -> b Source foldl' :: (b -> a -> b) -> b -> Array i a -> b Source foldr1 :: (a -> a -> a) -> Array i a -> a Source foldl1 :: (a -> a -> a) -> Array i a -> a Source toList :: Array i a -> [a] Source null :: Array i a -> Bool Source length :: Array i a -> Int Source elem :: Eq a => a -> Array i a -> Bool Source maximum :: Ord a => Array i a -> a Source minimum :: Ord a => Array i a -> a Source | |
| Ix i => Traversable (Array i) | С момента версии: base-2.1 |
Создание массива
Аргументы
| :: (IArray a e, Ix i) | |
| => (i, i) | пределы массива: (наименьшее, наибольшее) |
| -> [(i, e)] | список ассоциаций |
| -> a i e |
Создаёт неизменяемый массив из пары границ и списка начальных ассоциаций.
Границы задаются как пара наименьшей и наибольшей границ в массиве соответственно. Например, вектор с началом от 1 и длиной 10 имеет границы (1,10), а матрица 10х10 с началом от 1 имеет границы ((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 Source
Создаёт неизменяемый массив из списка начальных элементов. Список предоставляет элементы массива в порядке возрастания, начиная с наименьшего индекса.
Аргументы
| :: (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]
Доступ к массивам
(!) :: (IArray a e, Ix i) => a i e -> i -> e Source
Возвращает элемент неизменяемого массива в указанном индексе.
bounds :: (IArray a e, Ix i) => a i e -> (i, i) Source
Извлекает границы неизменяемого массива.
indices :: (IArray a e, Ix i) => a i e -> [i] Source
Возвращает список всех допустимых индексов в массиве.
elems :: (IArray a e, Ix i) => a i e -> [e] Source
Возвращает список всех элементов массива в том же порядке, что и их индексы.
assocs :: (IArray a e, Ix i) => a i e -> [(i, e)] Source
Возвращает содержимое массива в виде списка ассоциаций.
Инкрементные обновления массива
(//) :: (IArray a e, Ix i) => a i e -> [(i, e)] -> a i e Source
Принимает массив и список пар и возвращает массив, идентичный левому аргументу, за исключением того, что он был обновлён ассоциациями в правом аргументе. Например, если 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 Source
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 Source
Возвращает новый массив, полученный из исходного массива путём применения функции к каждому элементу.
ixmap :: (IArray a e, Ix i, Ix j) => (i, i) -> (i -> j) -> a j e -> a i e Source
Возвращает новый массив, полученный из исходного массива путём применения функции к каждому индексу.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/array-0.5.4.0/Data-Array-IArray.html