Алгебраические типы данных и их использование в программировании

Sep 27, 2009 23:42

Алгебраические типы данных и их использование в программировании

Роман Душкин

Аннотация Статья рассматривает важную идиому программирования - алгебраический тип данных (АТД). Приводится теоретическая база, которая лежит в основе практического применения АТД в различных языках программирования. Прикладные аспекты рассматриваются на языке ( Read more... )

Leave a comment

thedeemon October 16 2009, 17:31:20 UTC
Еще стоил упоминания вопрос пересечения наборов конструкторов разных типов. Polymorphic variants и связанные с ними штуки.

Reply

nponeccop October 16 2009, 18:06:09 UTC
пересечения наборов конструкторов разных типов??

Reply

thedeemon October 16 2009, 18:27:59 UTC
Именно!
В Хаскелле этого нету? Ну хоть чего-то. :)

Reply

nponeccop October 16 2009, 18:43:49 UTC
Их там нету из-за особенности алгоритма вывода типов. Вряд ли стоило перегружать этим статью.

Reply

thedeemon October 16 2009, 18:58:34 UTC
Тогда хотя бы сказать, что разные типы по конструкторам в хаскеле не пересекаются, ибо вопрос такой у читателя возникнуть может.

Reply

nponeccop October 16 2009, 19:11:19 UTC
То, что написали Вы - чушь. Хоть и можно догадаться, что вы имели ввиду, в статье стоит написать другое, чтобы читатель не гадал.

Типы Maybe Int и Maybe Char - разные, хотя и пересекаются по конструкторам.

Reply

thedeemon October 17 2009, 04:36:35 UTC
Да, плохо выразился.
Я про такой вопрос: если у нас есть data Maybe a = Nothing | Just a, можем ли мы определить тип data AnotherBool = Nothing | Something ?

Reply

antilamer October 17 2009, 05:14:20 UTC
Нет, т.к. тогда у терма Nothing не будет существовать "наиболее общего типа" (most general type), что противоречит идеям системы типов Haskell.

Reply

nponeccop October 17 2009, 09:50:14 UTC
Не совсем так. Идеи допускать одинаковые имена полей обсуждались в haskell-cafe, и принципиальных возражений не было, только усложнение вывода типов и то, что после изменения некоторые валидные программы станут невалидными, т.к. выводильщик типов с ними не справится.

А в Хаскеле что, до сих пор есть principal typing??

Reply

nponeccop October 17 2009, 09:42:24 UTC
Это как раз понятно. Но чтобы грамотно без примеров объяснить это, уйдет пара абзацев, что перегрузит статью.

Reply

os80 November 1 2009, 18:15:31 UTC
А что значит
data Maybe a = Nothing | Just a
"в отрыве" от монад? Т. е. что означают подобные конструкции сами по себе?

Reply

antilamer November 1 2009, 20:02:02 UTC
Это алгебраический тип (algebraic data type); охрененно полезная фича в абсолютно всех известных мне областях программирования (полезность АДТ можно сравнить с полезностью, например, массивов или структур), см. википедию, haskell wikibooks и т.п.

Reply

Re: os80 November 1 2009, 20:22:58 UTC
Прошу прощения. Видимо, чтобы что-то осознать, я должен задать самый идиотский вопрос из тех, что можно придумать. Только что читал про эти самые АТД в "ПФП"

Reply

Re: nponeccop November 1 2009, 22:46:31 UTC
Ну, там довольно по-дурацки написано.

lionet в соседнем топике написал примерно. в переводе на С++ запись data a = Nothing | Maybe a означает:

template
class Maybe
{
enum { tagMaybe, tagNothing } tag;
tag t;
union {
void mNothing;
struct {
a anon_m1;
}
}
public:
a getMaybe();
void getNothing();
bool isMaybe();
bool isNothing();
void setMaybe(a);
void setNothing(void);
}

Reply

lionet November 1 2009, 21:45:27 UTC
В данном случае определён полиморфный тип данных Maybe. Который может либо обозначать отсутствие данных (Nothing), либо обозначать присутствие данных какого-то конкретного типа a (Just a).

Думай о нём, как о контейнере опционального значения. Либо содержит, либо не содержит.

Эта конкретная штука моделирует такие вещи, как вызов функции, которая может дать результат, а может не дать.

Причём, другие функции могут и не знать, какой результат возвращается: они могут уметь работать с любыми данными, "обёрнутыми" в Maybe. Например, превращать списки Maybe a в с писки a:

catMaybes :: [Maybe a] -> [a]

В этом случае, эта функция объединит список [Just 3, Just 4, Nothing, Just 7] в [3, 4, 7], ничего не подозревая о типе Maybe Int.

Reply

nponeccop November 1 2009, 22:18:02 UTC
Ну как же "ничего не подозревая". Функция, ничего не подозревающая о типе, была бы

const :: a -> b или id :: a -> a

Reply


Leave a comment

Up