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

0

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

import  Data.Typeable

Главная программная сущность в этом модуле  — класс Typeable. Впрочем, вместе с этим классом определены ещё 7 классов от  Typeable1 до Typeable7, все из которых имеют одинаковое предназначение. Поэтому далее будет описан только класс Typeable.

Класс:  Typeable

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

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

class Typeable  a  where typeOf  ::  a ->  TypeRep

Единственный метод typeOf  получает на вход значение определённого типа и возвращает представление этого типа в виде значения типа TypeRep (см. ниже). Любое значение, переданное в этот метод, игнорируется, поэтому в него можно передавать значение (undefined   :: a).

В качестве экземпляра этого класса в стандартной поставке определены  все типы данных, конструкторы которых не параметризуют никаких типов. Соответственно, экземплярами классов Typeable1 — Typeable7 являются типы, определённые в стандартной поставке, у которых в конструкторах от 1 до 7 переменных типов. Для тех алгебраических типов данных, у которых имеется несколько конструкторов, для вычисления количества  параметризуемых типов  используется тот конструктор, у которого  максимальное число таких  типов. Например, тип Maybe (см. стр. 109) является экземпляром класса Typeable1, поскольку его конструктор Just параметризует один тип, а конструктор Nothing не параметризует никаких типов.

Функция: cast

Описание: безопасное преобразование типов.

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

cast  :: (Typeable   a, Typeable  b)  => a ->  Maybe b cast  x  = r

where

r = if typeOf  x  == typeOf  (fromJust r) then  Just  $  unsafeCoerce  x

else  Nothing

Функция: gcast

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

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

gcast  :: (Typeable   a, Typeable  b)  => c  a ->  Maybe (c b) gcast  x  = r

where

r = if typeOf  (getArg x) == typeOf  (getArg  (fromJust r)) then  Just  $ unsafeCoerce  x

else  Nothing getArg  ::  c  x  ->  x getArg  =  undefined

Функция: gcast1

Описание: вариант функции gcast для конструкторов сорта * ->  *.

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

gcast1  :: (Typeable1  t, Typeable1  t’) => c  (t a)  ->  Maybe  (c (t’  a)) gcast1  x  = r

where

r = if typeOf1  (getArg x) == typeOf1  (getArg  (fromJust r)) then  Just  $ unsafeCoerce  x

else  Nothing getArg  ::  c  x  ->  x getArg  =  undefined

Функция: gcast2

Описание: вариант функции gcast для конструкторов сорта * ->  *  ->  *.

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

gcast2  :: (Typeable2  t, Typeable2  t’) => c  (t a b)  ->  Maybe  (c (t’  a b)) gcast2  x  = r

where

r = if typeOf2  (getArg x) == typeOf2  (getArg  (fromJust r)) then  Just  $ unsafeCoerce  x

else  Nothing getArg  ::  c  x  ->  x getArg  =  undefined

Тип: TypeRep

Описание: конкретное (в противоположность абстрактному) представление мономорфного типа. Это представление поддерживает весьма эффективное  сравнение.

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

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

Этот тип данных является экземпляром следующих классов: Data, Eq, Show

и Typeable.

Тип: TyCon

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

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

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

Этот тип данных является экземпляром следующих классов: Data, Eq, Show

и Typeable.

Функция: mkTyCon

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

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

mkTyCon  :: String  ->  TyCon

mkTyCon  str = TyCon (mkTyConKey  str) str

Функция: mkTyConApp

Описание: применяет конструктор к последовательности типов.

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

mkTyConApp :: TyCon ->  [TypeRep]  ->  TypeRep

mkTyConApp  tc@(TyCon tc_k  _)  args  = TypeRep  (appKeys tc_k  arg_ks)  tc args where

arg_ks  = [k | TypeRep  k  _ _ < args]

Функция: mkAppTy

Описание: добавляет аргумент типа TypeRep в описание типа.

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

mkAppTy  :: TypeRep  ->  TypeRep  ->  TypeRep

mkAppTy  (TypeRep tr_k tc trs) arg_tr = let (TypeRep arg_k  _ _)  = arg_tr

in  TypeRep  (appKey tr_k arg_k) tc (trs  ++  [arg_tr])

Функция: mkFunTy

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

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

mkFunTy :: TypeRep  ->  TypeRep  ->  TypeRep mkFunTy f a  = mkTyConApp  funTc  [f, a]

Функция: splitTyConApp

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

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

splitTyConApp   :: TypeRep  ->  (TyCon,[TypeRep]) splitTyConApp  (TypeRep _ tc trs) = (tc, trs)

Функция: funResultTy

Описание:  применяет тип  к  функциональному  типу.  Возвращает   значение Just  u, если первый аргумент представляет функциональный тип t ->  u, а второй — значение  типа t. Если это не так, возвращает значение Nothing. Определение:

funResultTy :: TypeRep  ->  TypeRep  ->  Maybe  TypeRep funResultTy trFun   trArg =  case splitTyConApp   trFun   of

(tc, [t1, t2]) | tc == funTc  &&  t1 == trArg  ->  Just  t2

_                                                                                  ->  Nothing

Функция: typeRepTyCon

Описание: возвращает представление конструктора из представления типа данных.

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

typeRepTyCon ::  TypeRep  ->  TyCon typeRepTyCon (TypeRep  _  tc _)  = tc

Функция: typeRepArgs

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

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

typeRepArgs :: TypeRep  ->  [TypeRep] typeRepArgs  (TypeRep  _ _ args) = args

Функция: tyConString

Описание: возвращает строковое представление (наименование) конструктора.

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

tyConString :: TyCon ->  String tyConString    (TyCon  _ str) = str

Функция: typeRepKey

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

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

Функция: typeOfDefault

Описание: помогает создать экземпляр класса Typeable при помощи экземпляра класса Typeable1.

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

typeOfDefault :: (Typeable1  t, Typeable  a)  => t a ->  TypeRep typeOfDefault x  = typeOf1  x  ‘mkAppTy‘  typeOf  (argType  x)

where

argType ::  t  a ->  a argType =  undefined

Также     в    этом    модуле   определены  функции    от     typeOf1Default до typeOf6Default, которые выполняют те же самые действия, что и функция typeOfDefault, только для экземпляров классов Typeable1 — Typeable6.

8.31.     Модуль Unique

Модуль Unique предоставляет разработчикам программного обеспечения абстрактный интерфейс к генераторам уникальных объектов. Использование:

import  Data.Unique

Для  представления уникальных  объектов используется  изоморфный тип

Unique.

Тип: Unique

Описание: абстрактное представление  уникальных  объектов,  которые  можно сравнивать друг с другом в рамках классов Eq и  Ord. Кроме того, эти объекты можно хешировать в целые числа.

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

newtype Unique =  Unique Integer deriving (Eq,  Ord)

Функция: newUnique

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

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

newUnique  :: IO  Unique

newUnique = do val   < takeMVar  uniqSource let  next  = val   + 1

putMVar  uniqSource  next return  (Unique  next)

Функция: hashUnique

Описание: преобразует уникальный объект в значение типа Int. Два различных уникальных объекта теоретически могут преобразоваться в одно и то же значение типа Int, хотя это маловероятно на практике. Возвращаемое этой функцией значение является хорошим ключом для хеш-таблиц.

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

hashUnique :: Unique ->  Int

hashUnique (Unique  u)  = fromInteger (u  ‘mod‘  (toInteger (maxBound :: Int) + 1))

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

По теме:

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