GHC.Arr
| Авторские права | (c) Университет Глазго 1994-2000 |
|---|---|
| Лицензия | см. libraries/base/LICENSE |
| Поддержка | cvs-ghc@haskell.org |
| Стабильность | внутренняя |
| Переносимость | непереносимая (расширения GHC) |
| Безопасный Haskell | Небезопасный |
| Язык | Haskell2010 |
Содержание
Описание
Реализация массивов в GHC.
class Ord a => Ix a where Исходный код
Класс Ix используется для сопоставления непрерывного поддиапазона значений в типе с целыми числами. Он используется в основном для индексации массивов (см. пакет массивов).
Первый аргумент (l,u) каждой из этих операций — пара, определяющая нижнюю и верхнюю границы непрерывного поддиапазона значений.
Реализация имеет право предполагать следующие законы об этих операциях:
-
inRange (l,u) i == elem i (range (l,u)) -
range (l,u) !! index (l,u) i == i, когдаinRange (l,u) i -
map (index (l,u)) (range (l,u))) == [0..rangeSize (l,u)-1] -
rangeSize (l,u) == length (range (l,u))
Минимальное полное определение
range, (index | unsafeIndex), inRange
Методы
range :: (a, a) -> [a] Исходный код
Список значений в поддиапазоне, определяемом парой границ.
index :: (a, a) -> a -> Int Исходный код
Позиция индекса в поддиапазоне.
unsafeIndex :: (a, a) -> a -> Int Исходный код
Аналогично index, но без проверки, что значение находится в диапазоне.
inRange :: (a, a) -> a -> Bool Исходный код
Возвращает True ли заданный индекс лежит в диапазоне, определённом парой границ.
rangeSize :: (a, a) -> Int Исходный код
Размер поддиапазона, определяемого парой границ.
unsafeRangeSize :: (a, a) -> Int Исходный код
Аналогично rangeSize, но без проверки, что верхняя граница находится в диапазоне.
Экземпляры
Определено в GHC.IO.Device Методыrange :: (SeekMode, SeekMode) -> [SeekMode] Источник index :: (SeekMode, SeekMode) -> SeekMode -> Int Источник unsafeIndex :: (SeekMode, SeekMode) -> SeekMode -> Int Источник inRange :: (SeekMode, SeekMode) -> SeekMode -> Bool Источник rangeSize :: (SeekMode, SeekMode) -> Int Источник unsafeRangeSize :: (SeekMode, SeekMode) -> Int Источник | |
| Ix Void | С момента: base-4.8.0.0 |
Определено в Data.Void | |
| Ix a => Ix (Down a) | С момента: base-4.14.0.0 |
Определено в Data.Ord Методыrange :: (Down a, Down a) -> [Down a] Источник index :: (Down a, Down a) -> Down a -> Int Источник unsafeIndex :: (Down a, Down a) -> Down a -> Int Источник inRange :: (Down a, Down a) -> Down a -> Bool Источник rangeSize :: (Down a, Down a) -> Int Источник unsafeRangeSize :: (Down a, Down a) -> Int Источник | |
| Ix a => Ix (Identity a) | С момента: base-4.9.0.0 |
Определено в Data.Functor.Identity Методыrange :: (Identity a, Identity a) -> [Identity a] Исходный код index :: (Identity a, Identity a) -> Identity a -> Целое Исходный код unsafeIndex :: (Identity a, Identity a) -> Identity a -> Целое Исходный код inRange :: (Identity a, Identity a) -> Identity a -> Булево Исходный код rangeSize :: (Identity a, Identity a) -> Целое Исходный код unsafeRangeSize :: (Identity a, Identity a) -> Целое Исходный код | |
| (Ix a, Ix b) => Ix (a, b) | С: base-2.1 |
Определено в GHC.Ix Методыrange :: ((a, b), (a, b)) -> [(a, b)] Исходный код index :: ((a, b), (a, b)) -> (a, b) -> Целое Исходный код unsafeIndex :: ((a, b), (a, b)) -> (a, b) -> Целое Исходный код inRange :: ((a, b), (a, b)) -> (a, b) -> Булево Исходный код rangeSize :: ((a, b), (a, b)) -> Целое Исходный код unsafeRangeSize :: ((a, b), (a, b)) -> Целое Исходный код | |
| Ix (Proxy s) | С: base-4.7.0.0 |
Определено в Data.Proxy Методыrange :: (Proxy s, Proxy s) -> [Proxy s] Исходный код index :: (Proxy s, Proxy s) -> Proxy s -> Целое Исходный код unsafeIndex :: (Proxy s, Proxy s) -> Proxy s -> Целое Исходный код inRange :: (Proxy s, Proxy s) -> Proxy s -> Булево Исходный код rangeSize :: (Proxy s, Proxy s) -> Целое Исходный код unsafeRangeSize :: (Proxy s, Proxy s) -> Целое Исходный код | |
| (Ix a1, Ix a2, Ix a3) => Ix (a1, a2, a3) | С: base-2.1 |
Определено в GHC.Ix Методыrange :: ((a1, a2, a3), (a1, a2, a3)) -> [(a1, a2, a3)] Исходный код index :: ((a1, a2, a3), (a1, a2, a3)) -> (a1, a2, a3) -> Целое Исходный код unsafeIndex :: ((a1, a2, a3), (a1, a2, a3)) -> (a1, a2, a3) -> Целое Исходный код inRange :: ((a1, a2, a3), (a1, a2, a3)) -> (a1, a2, a3) -> Булево Исходный код rangeSize :: ((a1, a2, a3), (a1, a2, a3)) -> Целое Исходный код unsafeRangeSize :: ((a1, a2, a3), (a1, a2, a3)) -> Целое Исходный код | |
| Ix a => Ix (Const a b) | С: base-4.9.0.0 |
Определено в Data.Functor.Const Методыrange :: (Const a b, Const a b) -> [Const a b] Исходный код index :: (Const a b, Const a b) -> Const a b -> Int Исходный код unsafeIndex :: (Const a b, Const a b) -> Const a b -> Int Исходный код inRange :: (Const a b, Const a b) -> Const a b -> Bool Исходный код rangeSize :: (Const a b, Const a b) -> Int Исходный код unsafeRangeSize :: (Const a b, Const a b) -> Int Исходный код | |
| (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1, a2, a3, a4) | С момента: base-2.1 |
Определено в GHC.Ix Методыrange :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> [(a1, a2, a3, a4)] Исходный код index :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> (a1, a2, a3, a4) -> Int Исходный код unsafeIndex :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> (a1, a2, a3, a4) -> Int Исходный код inRange :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> (a1, a2, a3, a4) -> Bool Исходный код rangeSize :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> Int Исходный код unsafeRangeSize :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> Int Исходный код | |
| (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1, a2, a3, a4, a5) | С момента: base-2.1 |
Определено в GHC.Ix Методыrange :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> [(a1, a2, a3, a4, a5)] Исходный код index :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> (a1, a2, a3, a4, a5) -> Int Исходный код unsafeIndex :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> (a1, a2, a3, a4, a5) -> Int Исходный код inRange :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> (a1, a2, a3, a4, a5) -> Bool Исходный код rangeSize :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> Int Исходный код unsafeRangeSize :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> Int Исходный код | |
data Array i e Исходный код
Тип неизменяемых нестрогих (упакованных) массивов с индексами в i и элементами в e.
Экземпляры
| Functor (Array i) | Since: base-2.1 |
| Foldable (Array i) | Since: 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) | Since: base-2.1 |
Определено в Data.Traversable | |
| (Ix i, Eq e) => Eq (Array i e) | Since: base-2.1 |
| (Data a, Data b, Ix a) => Data (Array a b) | Since: base-4.8.0.0 |
Определено в Data.Data Методыgfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Array a b -> c (Array a b) Исходный код gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Array a b) Исходный код toConstr :: Array a b -> Constr Исходный код dataTypeOf :: Array a b -> DataType Исходный код dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Array a b)) Исходный код dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Array a b)) Исходный код gmapT :: (forall b0. Data b0 => b0 -> b0) -> Array a b -> Array a b Исходный код gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Array a b -> r Исходный код gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Array a b -> r Исходный код gmapQ :: (forall d. Data d => d -> u) -> Array a b -> [u] Исходный код gmapQi :: Int -> (forall d. Data d => d -> u) -> Array a b -> u Исходный код gmapM :: Monad m => (forall d. Data d => d -> m d) -> Array a b -> m (Array a b) Исходный код gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Array a b -> m (Array a b) Исходный код gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Array a b -> m (Array a b) Исходный код | |
| (Ix i, Ord e) => Ord (Array i e) | Since: base-2.1 |
Определено в GHC.Arr Методыcompare :: Array i e -> Array i e -> Ordering Исходный код (<) :: Array i e -> Array i e -> Bool Исходный код (<=) :: Array i e -> Array i e -> Bool Исходный код (>) :: Array i e -> Array i e -> Bool Исходный код (>=) :: Array i e -> Array i e -> Bool Исходный код max :: Array i e -> Array i e -> Array i e Исходный код min :: Array i e -> Array i e -> Array i e Исходный код | |
| (Ix a, Read a, Read b) => Read (Array a b) | Since: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS (Array a b) Исходный код readList :: ReadS [Array a b] Исходный код readPrec :: ReadPrec (Array a b) Исходный код readListPrec :: ReadPrec [Array a b] Исходный код | |
data STArray s i e Исходный код
Изменяемые, упакованные, нестрогие массивы в ST монаде. Аргументы типов следующие:
-
s: аргумент переменной состояния для типаST -
i: тип индекса массива (должен быть экземпляромIx) -
e: тип элементов массива.
Конструкторы
| STArray !i !i !Int (MutableArray# s e) |
Экземпляры
arrEleBottom :: a Исходный код
Аргументы
| :: Ix i | |
| => (i, i) | пара границ, каждая из которых является типом индекса массива. Эти границы — наименьший и наибольший индексы в массиве, в этом порядке. Например, вектор с началом с единицы длиной |
| -> [(i, e)] | список ассоциаций вида (индекс, значение). Обычно этот список будет выражен через понимание. Ассоциация |
| -> Array i e |
Создаёт массив с заданными границами и содержащий значения для заданных индексов в этих границах.
Массив является неопределённым (т.е. bottom), если какой-либо индекс в списке выходит за пределы границ. Отчёт Haskell 2010 дополнительно уточняет, что если в списке есть две ассоциации с одинаковым индексом, то значение в этом индексе неопределённо (т.е. bottom). Однако в реализации GHC значение в таком индексе — значение последней ассоциации с этим индексом в списке.
Поскольку индексы должны быть проверены на эти ошибки, array является строгим для аргумента границ и индексов списка ассоциаций, но не строгим для значений. Таким образом, возможны рекурсии, такие как:
a = array (1,100) ((1,1) : [(i, i * a!(i-1)) | i <- [2..100]])
Не каждый индекс в пределах границ массива должен присутствовать в списке ассоциаций, но значения, связанные с индексами, которые не появляются, будут неопределёнными (т.е. bottom).
Если в любом измерении нижняя граница больше верхней границы, то массив является допустимым, но пустым. Обращение к пустому массиву всегда приводит к ошибке границ массива, но bounds по-прежнему возвращает границы, с которыми был создан массив.
listArray :: Ix i => (i, i) -> [e] -> Array i e Исходный код
Создаёт массив из пары границ и списка значений в порядке индексов.
(!) :: Ix i => Array i e -> i -> e infixl 9 Исходный код
Значение по данному индексу в массиве.
safeRangeSize :: Ix i => (i, i) -> Int Исходный код
safeIndex :: Ix i => (i, i) -> Int -> i -> Int Исходный код
badSafeIndex :: Int -> Int -> Int Исходный код
bounds :: Array i e -> (i, i) Исходный код
Границы, с которыми был создан массив.
numElements :: Array i e -> Int Исходный код
Количество элементов в массиве.
numElementsSTArray :: STArray s i e -> Int Исходный код
indices :: Ix i => Array i e -> [i] Исходный код
Список индексов массива в порядке возрастания.
elems :: Array i e -> [e] Исходный код
Список элементов массива в порядке индексов.
assocs :: Ix i => Array i e -> [(i, e)] Исходный код
Список ассоциаций массива в порядке индексов.
Аргументы
| :: Ix i | |
| => (e -> a -> e) | функция накопления |
| -> e | начальное значение |
| -> (i, i) | пределы массива |
| -> [(i, a)] | список ассоциаций |
| -> Array i e |
Функция accumArray обрабатывает повторяющиеся индексы в списке ассоциаций, используя функцию накопления, которая объединяет значения ассоциаций с одинаковым индексом.
Например, задан список значений некоторого типа индекса, 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]
accumArray является строгой для каждого результата применения функции накопления, хотя и ленивой для начального значения. Таким образом, в отличие от массивов, построенных с помощью array, накопленные массивы обычно не должны быть рекурсивными.
adjust :: (e -> a -> e) -> MutableArray# s e -> (Int, a) -> STRep s b -> STRep s b Source
(//) :: Ix i => Array i e -> [(i, e)] -> Array i e infixl 9 Source
Создаёт массив, идентичный первому аргументу, за исключением того, что он обновлён ассоциациями из правого аргумента. Например, если m — это матрица 1-го начала, n по n, то
m//[((i,i), 0) | i <- [1..n]]
является той же матрицей, но с нулевыми значениями по диагонали.
Повторяющиеся индексы в списке ассоциаций обрабатываются как для array: Haskell 2010 определяет, что результирующий массив не определён (т. е. является неопределённым), но реализация GHC использует последнюю ассоциацию для каждого индекса.
accum :: Ix i => (e -> a -> e) -> Array i e -> [(i, a)] -> Array i e Source
accum f принимает массив и список ассоциаций и накапливает пары из списка в массив с помощью функции накопления f. Таким образом, accumArray может быть определено с помощью accum:
accumArray f z b = accum f (array b [(i, z) | i <- range b])
accum является строгой для всех результатов применения накопления. Однако, она ленива для начальных значений массива.
amap :: (a -> b) -> Array i a -> Array i b Source
ixmap :: (Ix i, Ix j) => (i, i) -> (i -> j) -> Array j e -> Array i e Source
ixmap позволяет выполнять преобразования индексов массива. Можно считать его композицией функций справа с отображением, которое изначально воплощает массив.
Аналогичное преобразование значений массива можно достичь с помощью fmap из экземпляра Array класса Functor.
eqArray :: (Ix i, Eq e) => Array i e -> Array i e -> Bool Source
cmpArray :: (Ix i, Ord e) => Array i e -> Array i e -> Ordering Source
cmpIntArray :: Ord e => Array Int e -> Array Int e -> Ordering Source
newSTArray :: Ix i => (i, i) -> e -> ST s (STArray s i e) Source
boundsSTArray :: STArray s i e -> (i, i) Source
readSTArray :: Ix i => STArray s i e -> i -> ST s e Source
writeSTArray :: Ix i => STArray s i e -> i -> e -> ST s () Source
freezeSTArray :: STArray s i e -> ST s (Array i e) Source
thawSTArray :: Array i e -> ST s (STArray s i e) Source
foldlElems :: (b -> a -> b) -> b -> Array i a -> b Source
Левостороннее свёртка по элементам
foldlElems' :: (b -> a -> b) -> b -> Array i a -> b Source
Строгая левосторонняя свёртка по элементам
foldl1Elems :: (a -> a -> a) -> Array i a -> a Source
Левосторонняя свёртка по элементам без начального значения
foldrElems :: (a -> b -> b) -> b -> Array i a -> b Source
Правосторонняя свёртка по элементам
foldrElems' :: (a -> b -> b) -> b -> Array i a -> b Source
Строгая правосторонняя свёртка по элементам
foldr1Elems :: (a -> a -> a) -> Array i a -> a Source
Правосторонняя свёртка по элементам без начального значения
Небезопасные операции
fill :: MutableArray# s e -> (Int, e) -> STRep s a -> STRep s a Source
done :: i -> i -> Int -> MutableArray# s e -> STRep s (Array i e) Source
unsafeArray :: Ix i => (i, i) -> [(Int, e)] -> Array i e Source
unsafeArray' :: (i, i) -> Int -> [(Int, e)] -> Array i e Source
lessSafeIndex :: Ix i => (i, i) -> Int -> i -> Int Source
unsafeAt :: Array i e -> Int -> e Source
unsafeReplace :: Array i e -> [(Int, e)] -> Array i e Source
unsafeAccumArray :: Ix i => (e -> a -> e) -> e -> (i, i) -> [(Int, a)] -> Array i e Source
unsafeAccumArray' :: (e -> a -> e) -> e -> (i, i) -> Int -> [(Int, a)] -> Array i e Source
unsafeAccum :: (e -> a -> e) -> Array i e -> [(Int, a)] -> Array i e Source
unsafeReadSTArray :: STArray s i e -> Int -> ST s e Source
unsafeWriteSTArray :: STArray s i e -> Int -> e -> ST s () Source
unsafeFreezeSTArray :: STArray s i e -> ST s (Array i e) Source
unsafeThawSTArray :: Array i e -> ST s (STArray s 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/base-4.14.1.0/GHC-Arr.html