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

0

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

import  Foreign.Marshal.Utils

Функция: with

Описание: вызов with  val  f выполняет монадическое действие ввода/вывода f, передавая ему в качестве параметра указатель на временно выделенный блок памяти, в который маршализовано значение val.  Другими словами, эта функция является комбинацией функций alloca и poke (см. стр. 445 и стр. 468 соответственно). Память, выделенная для хранения значения val, высвобождается после

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

with :: Storable a => a ->  (Ptr a ->  IO  b)  ->  IO b with val   f = alloca $

\ptr ->  do  poke  ptr  val res  < f  ptr return  res

Функция: new

Описание: выделяет блок памяти для хранения заданного значения  и маршализует его в эту память (комбинация функций malloc  и  poke —  см. стр. 445 и стр. 468 соответственно). Размер выделяемой  памяти определяется значением метода sizeOf  класса Storable  (см. стр. 468). Когда  выделенная  память больше не используется, её можно высвободить при помощи функций free или finalizerFree (см. стр. 447).

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

new :: Storable a => a  ->  IO (Ptr a) new val   =  do  ptr < malloc

poke  ptr  val return  ptr

Функция: fromBool

Описание: преобразует значение типа Bool из языка Haskell в числовое значение, используемое в языках программирования типа C.

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

fromBool  :: Num  a  => Bool  ->  a fromBool  False  = 0

fromBool  True    =  1

Функция: toBool

Описание: преобразует числовое представление булевского значения истинности, используемое в таких языках, как C, в значение типа Bool.

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

toBool   :: Num  a  => a ->  Bool toBool   = (/= 0)

Функция: maybeNew

Описание: выделяет память и маршализует значение, обёрнутое монадой Maybe. Для представления значения Nothing используется пустой указатель nullPtr. Определение:

maybeNew  :: (a  ->  IO (Ptr a)) ->  (Maybe a ->  IO  (Ptr a)) maybeNew  = maybe (return nullPtr)

Функция: maybeWith

Описание: преобразует  комбинатор  семейства with* в функцию,  работающую со значениями типа Maybe. Для представления значения  Nothing  используется пустой указатель nullPtr.

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

maybeWith :: (a  ->  (Ptr b ->  IO c) ->  IO c) ->  (Maybe a ->  (Ptr b ->  IO c)  ->  IO c) maybeWith = maybe ($  nullPtr)

Функция: maybePeek

Описание: преобразует  комбинатор  семейства peek* в функцию,  работающую со значениями типа Maybe. Для представления значения  Nothing  используется пустой указатель nullPtr.

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

maybePeek  :: (Ptr a ->  IO b)  ->  Ptr   a ->  IO  (Maybe b) maybePeek  peek ptr | ptr == nullPtr  =  return  Nothing

| otherwise          = do a < peek ptr

return  (Just  a)

Функция: withMany

Описание: применяет комбинатор семейства with* на список значений, выдавая на выходе список маршализованных объектов.

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

withMany :: (a  ->  (b  ->  res) ->  res) ->  [a] ->  ([b] ->  res)  ->  res withMany _             []     f = f []

withMany withFoo  (x:xs) f =  withFoo  x  $

\x’ ->  withMany withFoo  xs  (\xs’ ->  f (x’:xs’))

Функция: copyBytes

Описание: копирует заданное количество байт из второй области памяти (второй аргумент) в первую (первый аргумент). Области копирования не могут пересекаться. Аналог (обёртка над) функции memcpy.

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

copyBytes  :: Ptr   a ->  Ptr   a ->  Int ->  IO ()

copyBytes  dest  src  size = memcpy  dest  src  (fromIntegral size)

Функция: moveBytes

Описание: копирует заданное количество байт из второй области памяти (второй аргумент) в первую (первый аргумент). Области копирования могут пересекаться. Аналог (обёртка над) функции memmove.

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

moveBytes :: Ptr   a ->  Ptr   a ->  Int ->  IO ()

moveBytes dest  src  size = memmove  dest  src  (fromIntegral size)

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

По теме:

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