Главная » Haskell » Модуль Array (выделение памяти, маршализация)

0

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

import  Foreign.Marshal.Array

В этом модуле определены  только функции  в количестве  около  двадцати штук.

Функция: mallocArray

Описание: выделяет память для хранения заданного количества элементов типа, являющегося экземпляром класса Storable. Работает так же, как функция malloc  (см. стр. 445), однако для множества элементов заданного типа. Определение:

mallocArray :: Storable a => Int  ->  IO (Ptr a) mallocArray =  doMalloc  undefined

where

doMalloc  :: Storable a’ => a’ ->  Int ->  IO  (Ptr a’) doMalloc  dummy  size = mallocBytes  (size * sizeOf dummy)

Функция: mallocArray0

Описание: вариант функции  mallocArray, добавляющий  дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C).

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

mallocArray0 :: Storable a => Int  ->  IO (Ptr a) mallocArray0 size  =  mallocArray (size  + 1)

Функция: allocaArray

Описание: выделяет временную память для хранения заданного количества элементов типа, являющегося экземпляром класса Storable. Работает так же, как функция alloca (см. стр. 445), однако для множества элементов заданного типа. Память автоматически высвобождается сборщиком мусора.

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

allocaArray :: Storable a => Int ->  (Ptr a ->  IO  b)  ->  IO b allocaArray = doAlloca undefined

where

doAlloca :: Storable a’ => a’ ->  Int ->  (Ptr a’ ->  IO  b’) ->  IO b’ doAlloca dummy  size = allocaBytes (size *  sizeOf dummy)

Функция: allocaArray0

Описание: вариант функции  allocaArray, добавляющий  дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C).

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

allocaArray0 :: Storable a => Int ->  (Ptr a ->  IO b)  ->  IO b allocaArray0 size = allocaArray (size + 1)

Функция: reallocArray

Описание: изменяет размер массива, выделяя дополнительную или высвобождая излишнюю память.

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

reallocArray :: Storable a => Ptr   a ->  Int ->  IO  (Ptr a) reallocArray = doRealloc   undefined

where

doRealloc   :: Storable a’ => a’ ->  Ptr   a’ ->  Int ->  IO  (Ptr  a’) doRealloc   dummy  ptr size = reallocBytes ptr  (size  * sizeOf dummy)

Функция: reallocArray0

Описание: вариант функции reallocArray, добавляющий  дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C).

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

reallocArray0 :: Storable a => Ptr   a ->  Int ->  IO  (Ptr a) reallocArray0 ptr  size = reallocArray ptr  (size + 1)

Функция: peekArray

Описание: преобразует массив заданной длины в список языка Haskell. Эта функция обходит заданный массив сзаду наперёд, собирая список в накапливающий параметр, что требует постоянного размера стека.

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

peekArray  :: Storable a => Int ->  Ptr   a  ->  IO [a] peekArray  size ptr | size <= 0  =  return []

| otherwise = f (size-1) []

where

f 0 acc  = do e < peekElemOff  ptr  0 return  (e:acc)

f n acc  = do e < peekElemOff  ptr  n f (n   1)  (e:acc)

Функция: peekArray0

Описание: вариант функции peekArray, добавляющий дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C).

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

peekArray0  :: (Storable a, Eq a)  => a ->  Ptr   a  ->  IO [a] peekArray0  marker  ptr = do size < lengthArray0 marker  ptr

peekArray  size ptr

Функция: pokeArray

Описание: последовательно  записывает элементы заданного списка  в память по заданному указателю.

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

pokeArray  :: Storable a => Ptr   a ->  [a] ->  IO ()

pokeArray  ptr vals = zipWithM_  (pokeElemOff  ptr)  [0..]  vals

Функция: pokeArray0

Описание: вариант функции pokeArray, добавляющий дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C). Терминальный маркер задаётся первым аргументом.

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

pokeArray0  :: Storable a => a ->  Ptr   a ->  [a] ->  IO () pokeArray0  marker  ptr vals =  do pokeArray  ptr vals

pokeElemOff ptr  (length vals) marker

Функция: newArray

Описание: выделяет память и последовательно записывает в неё  элементы заданного списка.

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

newArray :: Storable a => [a]  ->  IO (Ptr a)

newArray vals = do ptr < mallocArray  (length vals) pokeArray  ptr vals

return  ptr

Функция: newArray0

Описание: вариант функции newArray, добавляющий дополнительную  память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C). Терминальный маркер задаётся первым аргументом.

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

newArray0 :: Storable a => a ->  [a] ->  IO  (Ptr a)

newArray0 marker  vals = do ptr < mallocArray0  (length  vals) pokeArray0  marker  ptr vals

return ptr

Функция: withArray

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

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

withArray :: Storable a => [a] ->  (Ptr a ->  IO b)  ->  IO b withArray vals = withArrayLen vals  .  constwithArray0

Функция: withArray0

Описание: вариант функции withArray, добавляющий дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C). Терминальный маркер задаётся первым аргументом.

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

withArray0 :: Storable a => a ->  [a] ->  (Ptr a ->  IO b)  ->  IO b  withArray0 marker  vals = withArrayLen0 marker  vals . const

Функция: withArrayLen

Описание: вариант функции withArray, однако выполняемое монадическое действие принимает на вход в качестве дополнительного параметра длину массива. Определение:

withArrayLen :: Storable a => [a] ->  (Int ->  Ptr   a ->  IO b)  ->  IO b withArrayLen vals  f = allocaArray len  $

\ptr ->  do pokeArray  ptr vals res  < f  len  ptr return res

where

len  = length vals

Функция: withArrayLen0

Описание: вариант функции withArrayLen, добавляющий  дополнительную память в конце выделяемого участка для хранения замыкающего (терминального)  элемента (аналог символа с кодом 0 в строках формата языка C). Терминальный маркер задаётся первым аргументом.

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

withArrayLen0 :: Storable a => a ->  [a] ->  (Int ->  Ptr   a ->  IO  b)  ->  IO b withArrayLen0 marker  vals f = allocaArray0 len  $

\ptr ->  do pokeArray0  marker  ptr  vals res  < f  len  ptr

return  res

where

len  = length vals

Функция: copyArray

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

copyArray  :: Storable a => Ptr   a ->  Ptr   a ->  Int ->  IO () copyArray  = doCopy undefined

where

doCopy :: Storable a’ => a’ ->  Ptr   a’ ->  Ptr   a’ ->  Int ->  IO ()

doCopy dummy  dest  src  size = copyBytes  dest  src  (size * sizeOf dummy)

Функция: moveArray

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

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

moveArray :: Storable a => Ptr   a ->  Ptr   a ->  Int ->  IO () moveArray = doMove  undefined

where

doMove  :: Storable a’ => a’ ->  Ptr   a’ ->  Ptr   a’ ->  Int ->  IO ()

doMove   dummy dest  src  size = moveBytes dest  src  (size * sizeOf dummy)

Функция: lengthArray0

Описание: возвращает количество элементов в заданном массиве, исключая терминальный маркер.

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

lengthArray0 :: (Storable a, Eq a)  => a ->  Ptr   a  ->  IO Int  lengthArray0 marker  ptr = loop  0

where

loop  i = do val   < peekElemOff ptr  i if val   ==  marker

then  return i

else  loop  (i + 1)

Функция: advancePtr

Описание: сдвигает указатель с начала массива на заданное количество элементов.

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

advancePtr  :: Storable a => Ptr   a ->  Int  ->  Ptr   a advancePtr  = doAdvance undefined

where

doAdvance :: Storable a’ => a’ ->  Ptr   a’ ->  Int  ->  Ptr   a’ doAdvance dummy  ptr i = ptr ‘plusPtr‘  (i  * sizeOf dummy)

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

По теме:

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