Spec-Zone.ru › Haskell 8

Data.Array

Авторские права (c) Университет Глазго 2001
Лицензия BSD-стиля (см. файл libraries/base/LICENSE)
Поддержка libraries@haskell.org
Стабильность предварительная
Переносимость переносимый
Безопасный Haskell Надежный
Язык Haskell2010

Содержание

  • Неизменяемые ленивые массивы
  • Создание массивов
  • Доступ к массивам
  • Инкрементные обновления массивов
  • Производные массивы

Описание

Базовые ленивые массивы.

Примечание: Модуль Data.Array.IArray предоставляет более общий интерфейс для неизменяемых массивов: он определяет операции с теми же именами, что и те, которые определены ниже, но с более общими типами, а также определяет Array экземпляры соответствующих классов. Чтобы использовать этот более общий интерфейс, импортируйте Data.Array.IArray, но не Data.Array.

Неизменяемые ленивые массивы

Haskell предоставляет индексируемые массивы, которые можно рассматривать как функции, области которых изоморфны непрерывным подмножествам целых чисел. Функции, ограниченные таким образом, могут быть реализованы эффективно; в частности, программист может разумно ожидать быстрого доступа к компонентам. Для обеспечения возможности такой реализации массивы рассматриваются как данные, а не как общие функции.

Поскольку большинство функций массивов включают класс Ix, этот модуль экспортируется из Data.Array, чтобы модули не должны были импортировать как Data.Array, так и Data.Ix.

module Data.Ix

data Array i e Источник

Тип неизменяемых ленивых (упакованных) массивов с индексами в 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)

С версии: base-2.1

Подробности об экземпляре

Определено в GHC.Arr

Методы

fmap :: (a -> b) -> Array i a -> Array i b Источник

(<$) :: a -> Array i b -> Array i a Источник

Foldable (Array i)

С версии: base-4.8.0.0

Подробности об экземпляре

Определено в 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 Источник

toList :: Array i a -> [a] Источник

null :: Array i a -> Bool Источник

length :: Array i a -> Int Источник

elem :: Eq a => a -> Array i a -> Bool Источник

maximum :: Ord a => Array i a -> a Источник

minimum :: Ord a => Array i a -> a Источник

sum :: Num a => Array i a -> a Источник

product :: Num a => Array i a -> a Источник

Ix i => Traversable (Array i)

С версии: base-2.1

Подробности экземпляра

Определено в Data.Traversable

Методы

traverse :: Applicative f => (a -> f b) -> Array i a -> f (Array i b) Исходный код

sequenceA :: Applicative f => Array i (f a) -> f (Array i a) Исходный код

mapM :: Monad m => (a -> m b) -> Array i a -> m (Array i b) Исходный код

sequence :: Monad m => Array i (m a) -> m (Array i a) Исходный код

(Ix i, Eq e) => Eq (Array i e)

С: base-2.1

Подробности экземпляра

Определено в GHC.Arr

Методы

(==) :: Array i e -> Array i e -> Bool

(/=) :: Array i e -> Array i e -> Bool

(Ix i, Ord e) => Ord (Array i e)

С: 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)

С: 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] Исходный код

(Ix a, Show a, Show b) => Show (Array a b)

С: base-2.1

Подробности экземпляра

Определено в GHC.Arr

Методы

showsPrec :: Int -> Array a b -> ShowS Исходный код

show :: Array a b -> String Исходный код

showList :: [Array a b] -> ShowS Исходный код

Создание массива

array Исходный код

Аргументы

:: Ix i
=> (i, i)

пара границ, каждая из которых имеет тип индекса массива. Эти границы — это наименьший и наибольший индексы в массиве в указанном порядке. Например, одномерный вектор длиной 10 имеет границы (1,10), а одномерная 10 на 10 матрица имеет границы ((1,1),(10,10)).

-> [(i, e)]

список ассоциаций вида (индекс, значение). Обычно этот список выражается как понятие. Ассоциация (i, x) определяет значение массива в индексе i как x.

-> Array i e

Создает массив с заданными границами, содержащий значения для заданных индексов в этих пределах.

Массив неопределен (т.е. ложь), если какой-либо индекс в списке выходит за границы. Отчёт о языке Haskell 2010 дополнительно указывает, что если какие-либо две ассоциации в списке имеют одинаковый индекс, значение в этом индексе неопределено (т.е. ложь). Однако в реализации 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 Source

Создает массив из пары границ и списка значений в порядке индексов.

accumArray Source

Аргументы

:: 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, накопленные массивы, как правило, не должны быть рекурсивными.

Доступ к массивам

(!) :: Ix i => Array i e -> i -> e infixl 9 Source

Значение по заданному индексу в массиве.

bounds :: Array i e -> (i, i) Source

Границы, с которыми был создан массив.

indices :: Ix i => Array i e -> [i] Source

Список индексов массива в порядке возрастания.

elems :: Array i e -> [e] Source

Список элементов массива в порядке индексов.

assocs :: Ix i => Array i e -> [(i, e)] 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 указывает, что полученный массив неопределен (т. е. bottom), но реализация 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 строго относительно всех результатов применения накопления. Однако, он ленив относительно начальных значений массива.

Производные массивы

ixmap :: (Ix i, Ix j) => (i, i) -> (i -> j) -> Array j e -> Array i e Source

ixmap позволяет выполнять преобразования над индексами массива. Его можно рассматривать как обеспечение композиции функций справа с отображением, которое воплощает исходный массив.

Аналогичное преобразование значений массива можно получить с помощью fmap из Array экземпляра класса Functor.

© 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.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API