Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_okonchatelny_variant.doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
553.98 Кб
Скачать

22. Сорта типов и структуры данных.

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

для обозначения сортов типов используются два символа:

1) (*) — «звездочка», которая обозначает сорт базовых типов или вообще какой-либо сорт типов;

2) (->) — «стрелка», являющая собой конструктор сортов типов.

При помощи конструктора сортов можно из имеющихся сортов создавать более сложные сорта типов. Например, имеется конструктор типа Maybe, который принимает на вход тип сорта (*) и возвращает на выходе тоже тип сорта (*). Поэтому считается, что сорт конструктора Maybe является таким: (* -> *).

Структуры данных

Структуры характеризуются тем, что они как бы группируют несколько значений различных типов в одну завершенную сущность. Каждое значение хранится в именованном поле, у которого описан тип, значения которого данное поле может принимать.

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

data Configuration = struct S

Configuration String -- Имя пользователя { char *Name;

String -- Адрес пользователя int tcbN;

String -- Адрес для~подключения bool N;

Bool -- Является~ли гостем? } a,b,c

Bool -- Является~ли супервизором?

String -- Текущий каталог

String -- Домашний каталог

Integer -- Время подключения

deriving (Eq, Show)

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

ющие суть поля. Для этих целей можно было бы написать примерно следующие функции:

getUserName (Configuration un _ _ _ _ _ _ _) = un

getLocalHost (Configuration _ lh _ _ _ _ _ _) = lh

getRemoteHost (Configuration _ _ rh _ _ _ _ _) = rh

getIsGuest (Configuration _ _ _ ig _ _ _ _) = ig

...

использование именованных полей:

data Configuration =

Configuration

{

userName :: String,

localHost :: String,

remoteHost :: String,

isGuest :: Bool,

isSuperuser :: Bool,

currentDirectory :: String,

homeDirectory :: String,

timeConnected :: Integer

}

В этом случае транслятор языка автоматически построит функции для до-

ступа к одиночным значениям данной структуры:

userName :: Configuration -> String

localHost :: Configuration -> String

...

Таким образом, использование именованных полей в структурах данных позволяет сделать исходный код более понятным и коротким, убирая необходимость создавать массу определений функций для доступа и обновления единичных значений. Кроме того, определяя подобные структуры экземплярами тех или иных классов и создавая методы этих классов для работы со структурами, можно подойти к точному воспроизведению понятия «объект» в смысле объектно-

ориентированного подхода.

Объекты 1 класса

Объектами первого класса («first-class object») в контексте конкретного языка программирования называются сущности, которые могут быть переданы как параметр, возвращены из функции, присвоены переменной[1].

Термин был впервые использован в контексте «функции как объекты первого класса» в середине 1960-х[2].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]