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

0

В модуле Types описываются проекции некоторых типов языка C в соответствующие типы языка Haskell. Использование:

import  Foreign.C.Types

Все типы, описываемые в этом модуле, необходимы для  аккуратного представления прототипов функций на языке C для доступа к интерфейсам библиотек из программ на языке Haskell. Системы языка Haskell не обязаны в точности повторять способы представления в памяти этих типов, однако следующие правила  гарантируют правильность работы с внешними функциями из  программ на языке Haskell:

1)                        Если функция на языке C принимает на вход аргумент или возвращает значение некоторого типа t, использование соответствующего типа CT на соответствующей позиции в декларации прототипа на языке Haskell заставляет программу на нём использовать правильное множество значений исходного типа. И наоборот, произвольное значение типа CT на языке Haskell имеет валидное представление в языке C.

2)                        Значение функции sizeOf  для значения (undefined   :: CT) абсолютно точно равно значению оператора sizeof (t) в языке C.

3)                        Значение функции alignment для значения (undefined   :: CT) соответствует ограничениям на тип в языке C.

4)                        Методы peek и poke класса Storable (см. стр. 468) проецируют все значения типа CT в соответствующие значения типа t.

5)                        Если для типа CT определён  экземпляр типа Bounded (см. стр. 115), то его методы minBound и maxBound возвращают  значения, соответствующие значениям t_MIN и t_MAX в языке C.

6)                        Если для типа CT определены экземпляры  классов Eq (см. стр. 117) и (или) Ord (см. стр. 121), то отношения между значениями типа CT, определяемые предикатами этих классов, в точности равны отношениям между соответствующими значениями класса t (другими словами, сохраняются отношения эквивалентности и порядка).

7)                        Если для типа  CT определены   экземпляры классов Num  (см.  стр.  120), Integral (см. стр. 119), Fractional (см. стр. 118), Floating (см. стр. 117), RealFrac (см. стр. 123) и RealFloat (см. стр. 122), то значения операций из этих классов в точности  равны  значениям соответствующих функций языка C.

8)                        Если для типа CT определён экземпляр класса Bits (см. стр. 245), то значения битовых операций в точности равны значениям соответствующих  операций языка C.

В следующей таблице описываются  целочисленные типы языка C и их представление в языке  Haskell. Все эти типы являются  экземплярами следующих классов: Eq, Ord, Num,  Read, Show,  Enum,  Typeable,  Storable, Bounded, Real, Integral и Bits.

Таблица 10.1. Целочисленные типы

Тип  Haskell

Тип  C

Определение

CChar

char

newtype  CChar = CChar  Int8

CSChar

signed char

newtype  CSChar  =  CSChar  Int8

CUChar

unsigned char

newtype  CUChar  =  CUChar  Word8

CShort

short

newtype  CShort =  CShort Int16

CUShort

unsigned short

newtype  CUShort =  CUShort  Word16

CInt

int

newtype  CInt  = CInt  Int32

CUInt

unsigned int

newtype  CUInt  = CUInt  Word32

CLong

long

newtype  CLong = CLong  Int32

CULong

unsigned long

newtype  CULong  =  CULong Word32

CLLong

long long

newtype  CLLong  =  CLLong  Int64

CULLong

unsigned long long

newtype  CULLong  =  CULLong  Word64

В следующей таблице описываются интегральные типы языка C  для представления различных значений (время, дата), а также их представление в языке Haskell. Все эти типы являются экземплярами следующих  классов: Eq, Ord, Num, Read, Show, Enum, Typeable и Storable.

Таблица 10.2. Интегральные типы

Тип  Haskell

Тип  C

Определение

CClock

clock_t

newtype  CClock =  CClock Int32

CTime

time_t

newtype  CTime =  CTime Int32

В следующей таблице описываются типы языка C для представления действительных чисел и их отображения в языке Haskell. Все эти типы являются экземплярами следующих классов: Eq, Ord, Num, Read, Show, Enum, Typeable, Storable, Real, Fractional, Floating, RealFrac и RealFloat.

Таблица 10.3.  Типы для представления действительных чисел

Тип  Haskell

Тип  C

Определение

CFloat

float

newtype  CFloat  =  CFloat  Float

CDouble

double

newtype  CDouble =  CDouble Double

CLDouble

long double

newtype  CLDouble =  CLDouble Double

Также  в этом модуле определены в виде примитивов  алгебраические типы данных, представляющие  собой соответствия  типам FILE, fpos_t и jmp_buf. Этим типам соответствуют типы языка Haskell: CFile,  CFpos и CJmpBuf.

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

По теме:

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