Главная » Haskell » Модуль IArray

0

В модуле IArray описывается общий интерфейс к произвольным  массивам, а потому к этому интерфейсу добавлен набор утилитарных функций для работы с произвольным массивом. Эти функции обобщают одноимённые функции из головного модуля Array  (см. раздел 8.1.). Также в этом модуле обобщается и сам алгебраический тип данных, представляющий массивы. Поэтому при подключении модуля IArray

import Data.Array.IArray

подключать модуль Array нельзя (и наоборот).

Класс:  IArray

Описание: интерфейс к произвольному массиву.

Определение:

class  IArray a e  where

bounds :: Ix i => a i e ->  (i, i)

Описывает единственный метод, который  возвращает границы  области индексации массивов в виде пары. Все остальные утилитарные функции построены с использованием этого метода.

Для этого класса определено 35 различных экземпляров для разнообразных массивов, хранящих элементы самых разных типов. Все основные примитивные типы данных охвачены экземплярами этого класса для соответствующих массивов.

Кроме уже описанных в разделе 8.1. функций в этом модуле определена ещё одна функция.

Функция: amap

Описание: создаёт новый массив на основе заданного при помощи применения к каждому элементу исходного массива заданной функции. Аналог функции map (см. стр. 356) для списков.

Определение:

amap  :: (IArray a e’, IArray a e, Ix i) => (e’ ->  e)  ->  a i  e’ ->  a i e

Функция определена в виде примитива.

8.1.3.       Модуль IO

Модуль IO (из пакета Data) содержит описания примитивных типов для представления ограниченных и неограниченных  массивов в монаде IO. Использование модуля:

import  Data.Array.IO

Тип: IOArray

Описание: изменяемый ограниченный нестрогий массив в рамках  монады IO. Первое поле типа отвечает за индексы массива (тип  поля должен обязательно иметь экземпляр класса Ix), второе поле отвечает за элементы массива произвольного типа.

Определение:

data  IOArray  i  e = …

Тип определён в виде примитива.

Данный  тип  имеет определённые  экземпляры  для  следующих   классов:

Typeable2, MArray, IArray, Eq.

Тип: IOUArray

Описание: изменяемый неограниченный строгий массив в рамках  монады IO. Первое поле типа отвечает за индексы массива (тип поля  должен обязательно иметь экземпляр класса Ix), второе поле отвечает за элементы массива. Элементы массива могут быть только определённых типов: см. подраздел 8.1.5. со списком экземпляров.

Определение:

data  IOUArray  i  e = …

Тип определён в виде примитива.

Для  этого типа определено  более 30 различных экземпляров для  классов IArray (см. стр. 233) и MArray (см. стр. 237), хранящих  элементы самых разных типов. Все основные примитивные типы  данных охвачены экземплярами этого класса для соответствующих массивов.

Функция: castIOUArray

Описание: преобразует входной массив типа IOUArray в такой же, но содержащий элементы иного типа. При этом все элементы в результате становятся  неопределёнными.

Определение:

castIOUArray  :: IOUArray  ix a ->  IO  (IOUArray  ix b)

Функция определена в виде примитива.

Функция: hGetArray

Описание: считывает заданное количество элементов из входного файла (потока) непосредственно в массив. Первый аргумент определяет входной файл, второй —  массив, в который  производится чтение  файла (элементы типа Word8), третий — требуемое  количество элементов. Функция возвращает количество считанных элементов, которое может быть меньше заказанного.

Определение:

hGetArray  :: Handle ->  IOUArray  Int Word8 ->  Int ->  IO Int hGetArray  handle  arr count  = do  bds < getBounds arr

if (count < 0 || count  > rangeSize  bds)

then  illegalBufferSize  handle  "hGetArray" count else  get  0

where

get  i | i == count  = return i

| otherwise   = do error_or_c < try  (hGetChar  handle) case  error_or_c of

Left ex | isEOFError  ex ->  return i

| otherwise       ->  ioError ex

Right   c  ->  do unsafeWrite arr  i  (fromIntegral (ord c)) get  (i  + 1)

Функция: hPutArray

Описание: записывает  заданное количество  элементов из массива в  выходной файл (поток).  Первый аргумент определяет выходной файл, второй — массив источник с элементами типа Word8, третий — требуемое  количество элементов, которое должно быть записано в файл.

Определение:

hPutArray   :: Handle ->  IOUArray  Int Word8 ->  Int ->  IO () hPutArray   handle  arr count  = do  bds < getBounds arr

if (count < 0 || count  >  rangeSize  bds)

then  illegalBufferSize  handle  "hPutArray" count else  put  0

where

put  i | i == count  = return ()

| otherwise   = do w  < unsafeRead arr i

hPutChar handle  (chr  (fromIntegral w)) put  (i +  1)

Модуль  Internals

Служебный модуль Internals, в котором в виде примитивов определяются экземпляры классов IArray и MArray для типа IOUArray. Не должен использоваться напрямую, поскольку он сам всегда включён в модуль IO из пакета Data.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии