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

0

описывает базовый интерфейс для представления и работы с динамическими типами. Также в этом модуле определены функции для преобразования значений произвольных типов в динамические значения и обратно. Использование:

import  Data.Dynamic

Тип: Dynamic

Описание: значение динамического  типа представляет  собой объект, к которому приписан его тип.

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

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

Этот тип данных может представлять только мономорфное значение. Попытка создать динамический тип их полиморфного выражения приведёт к неопределённости (см. ниже описание функции toDyn).

Для этого типа данных определены экземпляры классов Show и Typeable. Вывод на экран величин с динамическими типами очень полезен и удобен для отладки программ.

Функция: toDyn

Описание: преобразует значение произвольного  типа в динамическое значение. Данная функция преобразует только мономорфные значения (и это гарантирует ограничение Typeable  a =>). Чтобы сконвертировать полиморфное значение, его необходимо «мономорфировать»  перед передачей в эту функцию (например, вызов toDyn (id :: Int -> Int)).

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

toDyn  :: Typeable  a =>  a  ->  Dynamic

toDyn  v  = Dynamic (typeOf v)  (unsafeCoerce  v)

Функция: fromDyn

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

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

fromDyn :: Typeable  a => Dynamic  -> a ->  a

fromDyn (Dynamic t v) def  | typeOf  def  == t =  unsafeCoerce  v

| otherwise            = def

Функция: fromDynamic

Описание: преобразует  значение динамического типа назад в значение  произвольного типа языка Haskell. Если такое преобразование возможно, то функция возвращает преобразованное значение, обёрнутое в конструктор Just типа Maybe (см. стр. 109). Если нет, возвращает значение Nothing.

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

fromDynamic :: Typeable  a => Dynamic ->  Maybe a fromDynamic (Dynamic t v) = case  unsafeCoerce  v  of

r | t == typeOf  r ->  Just  r

| otherwise       ->  Nothing

Функция: dynApply

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

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

dynApply  :: Dynamic ->  Dynamic ->  Maybe  Dynamic dynApply  (Dynamic t1 f)  (Dynamic  t2 x)

= case funResultTy t1 t2 of

Just  t3 ->  Just  (Dynamic t3  ((unsafeCoerce  f) x)) Nothing  ->  Nothing

Функция: dynApp

Описание: применяет функцию к значениям динамического типа.  Если  такое применение возможно, то возвращает результат функции также динамического типа. Если применение невозможно, возвращает ошибку.

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

dynApp :: Dynamic ->  Dynamic  ->  Dynamic dynApp f  x  = case dynApply  f x  of

Just  r ->  r

Nothing  ->  error ("Type  error in dynamic  application.\n" ++ "Can’t  apply  function " ++ show f ++

" to argument " ++ show x)

Функция: dynTypeRep

Описание: возвращает описание типа из значения динамического типа.

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

dynTypeRep  ::  Dynamic  ->  TypeRep dynTypeRep  (Dynamic  tr _)  = tr

8.7.   Модуль Either

В модуле Either дублируются описания типа Either и функции для его обработки. Данный модуль создан в экспериментальном порядке в целях постепенной разгрузки стандартного модуля Prelude. Все определённые в модуле Either программные сущности определены и в модуле Prelude. Использование:

import Data.Either

Соответственно, в рассматриваемый модуль вынесены определения: алгебраического типа данных Either (см. стр. 109) и функции either (см. стр. 132).

Также в модуле Either определены экземпляры типа Either для следующих классов: Typeable1, Functor,  Data, Eq, Ord, Read и Show.

Необходимо отметить, что по соглашению тип Either используется для представления величин, которые могут нести в себе описание ошибочной ситуации. Конструктор Left этого типа используется для представления ошибок, конструктор Right — для представления обычных значений соответственно (здесь имеется дополнительное мнемоническое правило: слово right с английского языка можно перевести как «правый» и как «правильный»).

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

По теме:

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