Научная статья на тему 'Фантомные типы данных на основе отношения предпорядка'

Фантомные типы данных на основе отношения предпорядка Текст научной статьи по специальности «Математика»

CC BY
88
17
i Надоели баннеры? Вы всегда можете отключить рекламу.
Область наук
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Фантомные типы данных на основе отношения предпорядка»

4, Вагнер B.B. Теория отношений и алгебра частичных отображений // Теория полугрупп и её приложения, Саратов: Изд-во Сарат, ун-та, 1965, Вып. 1, С, 3-178,

УДК 519.682.1

A.A. Орел

ФАНТОМНЫЕ ТИПЫ ДАННЫХ НА ОСНОВЕ ОТНОШЕНИЯ ПРЕДПОРЯДКА

В работе [1] рассмотрена технология функционального программирования на языке Haskell, основанная на применении так называемых фантомных типов (phantom types), построенных на основе отношения эквивалентности между типами. Фантомные типы определяются [2] как типы данных, применяемые только для того, чтобы создавать другие типы данных, при этом их значения никогда не используются.

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

Для иллюстрации применения этого отношения рассмотрим задачу построения интерпретатора для простого языка выражений, предложенного в работе [3]. Выражения этого языка должны представлять операции сложения целых чисел, конъюнкции и условные операторы, а также удовлетворять требованию статического контроля типов. Следующий алгебраический тип данных Ехр на языке Haskell дает представление синтаксиса этих выражений.

data Exp = LitInt Int

I LitBool Bool

I Plus Exp Exp

I And Exp Exp

I If Exp Exp Exp

Проблема, связанная с данным представлением, состоит в том, что формальные параметры выражений не содержат информацию о типе. Таким образом, статический контроль типов успешно пройдут выражения вида

PlusCLitlnt 3)(LitBool False)

Однако в процессе выполнения программы будет обнаружена ошибка несоответствия типов.

Решить проблему можно с помощью расслоения грамматики выражений так, чтобы она отражала информацию об используемых типах данных. Однако расслоение грамматики влечет за собой функциональное расслоение программы, которое, в свою очередь, приводит к большому количеству почти повторяющегося кода, что недопустимо с технологической точки зрения. В работе [3] для решения данной проблемы предложено использовать в определении Ехр фантомный типовой параметр а, назначение которого состоит в том, чтобы аннотировать тип Ехр на уровне мета описаний. В этом случае модифицированное определение Ехр принимает вид

data Ехр а = Lit а

I Plus (Ехр а) (Ехр а)

I And (Ехр а) (Ехр а)

I If (Ехр а) (Ехр а) (Ехр а)

Построенный тип позволяет решить проблему статического контроля типов выражений с помощью определения функций вида

plus : : Ехр lilt -> Ехр Int -> Ехр Int plus = Plus

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

evalExp :: Ехр а -> а evalExp (Lit i) = i

evalExp (Plus x y) = evalExp x + evalExp у evalExp (And x y) = evalExp x && evalExp у evalExp (If с t e) = if(evalExp c) then (evalExp t)

else (evalExp e)

При компиляции этих выражений система контроля типов Haskell сообщает о невозможности совместить тип переменной а с базовыми типами Int или Bool.

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

data Exp a = Lit a

I Plus (Int -> a) (Exp Int) (Exp Int)

I And (Bool -> a)(Exp Bool)(Exp Bool) I If (Exp Bool) (Exp a) (Exp a)

Поскольку отношение предпорядка не симметрично, следует определить правило выбора позиций типовых аргументов. Будем всегда выбирать в качестве первого аргумента более ограниченный тип данных, чем в качестве второго аргумента. Например, правильным будет выбор Int -> а, а не а -> Int. Заметим, что первая конструкция в отличие от второй представляет фантомный тип, поскольку сигнатуру Int -> а может иметь только всюду неопределенная функция. Свойство рефлексивности будем моделировать с помощью тождественной функции id, а свойство транзитивности с помощью операции композиции (.). Необходимо определить также правило замены выражений, содержащих модифицированные конструкторы данных. Считая, что отношение предпорядка задает первый параметр в определении модифицированного конструктора данных С, и, обозначив реализующую его функцию как р, будем заменять выражение

f (С pi, ... pn) = е

на

f (С р, pi, ... pn) = р е

Данное правило полностью согласуется с правилом модификации выражений, использующих параметр, реализующий отношение эквивалентности (см. [1]).

Применяя рассмотренные процедуры для модификации функции сложения и для интерпретатора выражений типа Ехр, получим

plus : : Exp lilt -> Exp Int -> Exp Int plus = Plus id

и

evalExp :: Exp a -> a evalExp (Lit i) = i

evalExp (Plus f x y) = f $ evalExp x + evalExp у evalExp (And f x y) = f $ evalExp x && evalExp у evalExp (If с t e) = if (evalExp c) then (evalExp t)

else (evalExp e)

В результате могут быть вычислены выражения, подобные следующему:

evalExp (plus (Lit (1 :: lilt)) (Lit (2 :: lilt)))

В то же время выражения вида

plus (Lit (1 :: lilt)) (Lit True)

не пройдут статического контроля типов.

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Hinze R. Fun with phantom types // The Fun of Programming, Cornerstones in Computing. Palgrave, 2003. P. 245-262.

2. http://www.haskell.org/haskellwiki/Phantom_type

3. http://babel.ls.fi.upm.es/~pablo/Papers/Notes/GADTs.html

УДК 517.95

Д.В. Поплавский

О НЕЛИНЕЙНОЙ ЭВОЛЮЦИИ МАТРИЦЫ ВЕЙЛЯ СОГЛАСНО НАЧАЛЬНО-КРАЕВОЙ ЗАДАЧИ

НА ПОЛУОСИ ДЛЯ ВЕКТОРНОГО МОДИФИЦИРОВАННОГО УРАВНЕНИЯ КДФ

Рассмотрим следующую задачу:

ut + 2ux(3u2 + v2) + 4uvvx + uxxx = 0,

vt + 2vx(3v2 + u2) + 4vuux + vxxx = 0, x > 0, t > 0,

(i)

u(x, 0) = u0(x), v(x, 0) = vo(x), (2)

u(0,t) = ui(t), ux(0,t)= u2 (t), uxx(0,t) = u3 (t), v(0, t) = vi(t), vx(0,t) = v2(t), vxx(0,t) = v3(t).

(3)

где щ, Ук, к = 0, 3, - непрерывные комплекснозначные функции (м0(ж), г>о(ж) Е Ь(0, то), и0(0) = М1(0), у0(0) = У1(0)). Известно, что система (1) допускает эквивалентное представление нулевой кривизны [1], что дает возможность для нахождения ее решения применить метод обратной спектральной задачи [2], в котором нелинейная задача (1)-(3) сводится к обратной спектральной задаче на полуоси для дифференциальной системы с кратными корнями характеристического многочлена [3]. При этом соответствующей спектральной характеристикой выступает матрица Вейля. В [2] получены эволюционные уравнения на элементы матрицы Вейля и алгоритм решения задачи (1)-(3). То обстоятельство, что данные уравнения носят нелинейный характер, в определенной степени затрудняет реализацию метода обратной спектральной задачи именно в случае «полуоси». В настоящей статье приводится один

i Надоели баннеры? Вы всегда можете отключить рекламу.