Pull to refresh

Списки и другие структуры данных в Ocaml

Reading time2 min
Views1.5K

Введение


Кроме базовых типов данных в Objective Caml к предопределенным типам относятся кортеж, список, запись.

Кортеж


Значения разных типов могут быть сгрупированны воедино, в общую структуру данных — кортеж. Значения входящие в состав кортежа, разделяются между собой с помощью запятой. Для конструкции кортежа используется символ *.
Допустим string*char — есть кортеж, в котором первый элемент строка, а второй символ.

# («Habrahabr»,'A');;
-:string*char = «Habrahabr», 'A'
#(100,10.2);;
-:int*float = 100,10.2

Можно и избежать использования скобок (...) в объявлении кортежа, разницы в принципе нет, но с скобками, помоему читабельней:

# «Habrahabr»,'A';;
-:string*char = «Habrahabr», 'A'

Как мы видем в вышеописанном примере, без скобок результат не изменился.

Функции для работы с кортежами:
fst — возвращает первый элемент кортежа
snd — возвращает второй элемент кортежа
Обе функции являются полиморфными, то есть входной аргумент может быть любого типа.

#fst;;
-: 'a' * 'b' -> 'a = #fst(100,10);;
-: int = 100

Записи


Запись — это кортеж, в котором каждому присваивается имя. Записи всегда соответствуют объявлению нового типа. Для определения новой записи необадимо указать ее имя, а также имя и тип для каждого поля записи, то есть синтаксис объявления записи выглядит следующим образом:
type recordName = {field1: dataType; field2:dataType}
где type — ключевое слово в Objective Caml, recordName — имя нашей записи, field1,field1 — поля нашей записи, dataType — тип данных полей записи. С помощью этой базовой конструкции синтаксиса описания записи можно описать любую запись в Objective Caml:
type complexNum = {real:float; im:float};;
type complexNum ={real:float; im:float}
Для того что бы создать значение типа запись, нужно присвоить каждому полю записи значение:
В следующем примере создадим комплексное число, в котором реальная чать будет равна 6, а мнимая 8:
type complexNum = {real:float; im:float};;
type complexNum ={real:float; im:float}
let num = {real = 6; im = 8}
val num: complexNum = {real = 6; im =8}
Доступ к полям записи может осуществляться с помощью двух способов: оператор точка — взятие поля, либо сопоставлением некоторы полей.
1) expr.field
Здесь expr какое-то выражение — запись, field — требуемое поле записи.
2){field1 = e1;… fieldn =en}
Здесь e1,...,en — образцы сопоставления.
Примуществом записи перед кортежем является более информативное описание. благодаря именам полей записи.

Списки


Значение одного и того же типа могут быть объеденины в структуру данных — список. Список в Objective Caml может быт либо пустым, либо содержать однотипные элементы.
#[];;
-: 'a list = []
#[1;2;3];;
-: int list = [1;2;3]
Для того что бы добавить новый элемент в начало списка, существует следующая функция, определнная в виде инфексного оператора ::
# 1 :: [2;3];;
-: int list = [1;2;3]
Для объедеинения списков существует инфиксный оператор @:
# [1] @ [2;3];;
-: int list = [1;2;3]
Остальные функции для работы со списками определены в библиотеке List.
Tags:
Hubs:
+2
Comments0

Articles

Change theme settings