LINUX.ORG.RU

Теория баз данных и Haskell.


0

0

Решил попробовать изучить Haskell и функциональное программирование. Хочу написать простую базу данных.

Значит для начала мне нужно определить основные элементы: домен, атрибут, кортеж, заголовок, отношение.

Пока я их определил так:

Домен (пока у меня два типа)

data Domain = Bool | Integer

Имя атрибута:

type Attribute = String

Заголовок:

type Header = [Attribute]

Кортеж (частичная функция от имени аттрибута к значению):

type Tuple = String -> Domain

Отношение:

type Relation = [Tuple]

Основывался, правда, на Википедии: http://en.wikipedia.org/wiki/Relational_model.

Как считаете, правильные ли определения я написал? И что можно хорошее почитать по реляционной модели? Дейт описывает как-то уж очень неформально. Хотелось бы чистой математики, достаточно одной статьи. Нашел только "A formal definition of the relational model" от 1982 года. Оно не сильно устарело?

anonymous

И еще разок почти то же самое (как сейчас):
data Domain    = Bool | Integer
type Attribute = String
type Header    = [Attribute]
type Tuple     = Attribute -> Domain
type Body      = [Tuple]
type Relation  = (Header, Body)

Понятно, что в Header нужно еще включить типы. Но вообще непонятно, нужен ли этот Header. Википедия все же не самый достоверный источник.

anonymous
()
Ответ на: комментарий от dilmah

А что, на русском лучше, чем на английском пишут?

anonymous
()

1) data Domain = Bool | Integer не должно скомпилироваться. Потому как идентификаторы Bool и Integer уже есть.

2) String -> Domain - это, пардон, что такое? Зачем тебе разбивать все возможные строки на два подмножества?

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Вообщем сделал пока так:
-- Domain - attribute value
type Domain    = String
-- Domain name — attribute
type Attribute = String
-- A row of attribute values — tuple 
type Tuple     = Attribute -> Domain

type Heading   = [Attribute]
type Body      = [Tuple]
type Relation  = (Heading, Body)

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

Вообщем начинаю с начала писать с объяснениями. Есть таблица базы данных (Relation). Она состоит из заголовка и тела:
  type Relation = (Heading, Body)
В заголовке в определенном порядке должны быть записаны названия атрибутов и их типы. Чтобы порядок сохранялся, это должен быть лист:
  type Heading = [Attribute]
Атрибут состоит из имени и типа (домена):
  type Attribute = (Name, Domain)
  type Name      = String
  type Domain    = TEXT | INTEGER
Теперь тело таблицы. Оно состоит из кортежей (tuple):
  type Body      = [Tuple]
Кортеж — это частичная функция от атрибута, возвращающая его значение.
  type Tuple     = Attribute -> ?

Вот тут я не знаю, как правильно написать. Нужно, чтобы под тип tuple подходило и
(Name, TEXT) -> String
и
(Name, Integer) -> Integer

Как это сделать, и возможно ли это вообще? И если невозможно, то как сделать правильно?

anonymous
()
Ответ на: комментарий от anonymous

> Прежде всего хотелось бы чтобы Domain был как бы составным типом, то есть мог содержать хоть строку, хоть число, хоть логический тип.

data Domain = DomStr String | DomNum Integer | DomBool Bool

И убери многочисленные type-ы, они очень мешают понимать сообщения компилятора об ошибках. data и newtype гораздо удобнее.

> Вот тут я не знаю, как правильно написать. Нужно, чтобы под тип tuple подходило и > (Name, TEXT) -> String > и > (Name, Integer) -> Integer

Зачем? Почему не просто Name -> String и Name -> Integer? Обычный тип с параметром.

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

> Прежде всего хотелось бы чтобы Domain был как бы составным типом, то есть мог содержать хоть строку, хоть число, хоть логический тип.

data Domain = DomStr String | DomNum Integer | DomBool Bool

И убери многочисленные type-ы, они очень мешают понимать сообщения компилятора об ошибках. data и newtype гораздо удобнее.

> Вот тут я не знаю, как правильно написать. Нужно, чтобы под тип tuple подходило и > (Name, TEXT) -> String > и > (Name, Integer) -> Integer

Зачем? Почему не просто Name -> String и Name -> Integer? Обычный тип с параметром.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Имя конструктора может совпадать с именем типа. Так что вполне
можно так:

data Domain = String String | Number Integer

instance Show Domain where
	show (String s) = s
	show (Number n) = show n

proba = [Number 0, String "Hello", String "all", Number 12]

Main> :t proba
proba :: [Domain]
Main> show proba
"[0,Hello,all,12]"

anonymous
()
Ответ на: комментарий от anonymous

> Так что вполне > можно так:

> data Domain = String String | Number Integer

Можно, но я бы не советовал. ИМХО, не стоит использовать имя типа как имя конструктора в ДРУГОМ типе.

> instance Show Domain where > show (String s) = s > show (Number n) = show n

Уй. Можно, конечно, но, ИМХО, instance Show, в котором из выведенной информации не ясно, какого типа (хотя бы примерно) эта информация - неправилен.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.