Предоставляет ли Opa алгебраические типы данных?

Я пытаюсь глубже понять концепции Opa. В частности, меня интересует решение не предоставлять размеченные объединения, как в ML или Haskell (т. е. определять несколько конструкторов, которые оборачивают ноль или более значений), а оставаться с типами записей и типами их сумм. Это решение имеет для меня полный смысл (возможно, потому, что я больше увлекаюсь ООП, чем ФП), и кажется, что можно реализовать все, что можно было бы сделать с помощью размеченного объединения.

Однако можем ли мы тогда сказать, что язык по-прежнему поддерживает алгебраические типы данных? Это не практический вопрос, а вопрос терминологии.

Кстати, Википедия говорит, что да, возможно, это следует исправить.


person Milo    schedule 04.03.2012    source источник
comment
Opa предоставляет типы суммы и произведения (возможно, рекурсивные, возможно, абстрактные), поэтому, насколько я понимаю термин алгебраических типов данных, я бы сказал, да, абсолютно, у Opa они есть.   -  person akoprowski    schedule 05.03.2012
comment
Можете ли вы дать мне ссылку на такое определение алгебраических типов данных (согласно тому, какие они есть у Opa)? Возможно, проблема в том, что термин не имеет строгого определения, например, определение из foldoc.org/алгебраические+данные +type утверждает (насколько я понимаю), что значения должны быть определены в терминах приложений-конструкторов, чего нет в Opa.   -  person Milo    schedule 05.03.2012
comment
Насколько я понимаю, алгебраические типы данных предназначены для предоставления сумм типов продуктов. Я не понимал, что маркировка вариантов суммы с помощью конструкторов имеет решающее значение; если это так, то вы действительно правы, Opa не подходит, хотя я бы посчитал это в основном терминологическим спором, поскольку его система типов способна на все, что можно делать с алгебраическими типами данных (и многое другое).   -  person akoprowski    schedule 06.03.2012


Ответы (1)


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

Где в ocaml вы напишете type tree = Leaf of int | Node of tree * tree

В Опе будет type tree = {int leaf} or {tree left, tree right}

Вы можете заметить, что, в отличие от Ocaml, в Opa вы можете манипулировать записями, не определяя явно их тип. Вот почему, даже если Opa использует только записи, определить размеченное объединение по-прежнему просто.

Кстати, вы посмотрели на http://doc.opalang.org/manual/The-type-system ?

person Cédrics    schedule 04.03.2012
comment
Да, я посмотрел мануал. Что привлекло мое внимание, так это... если несколько случаев (т.е. записей) суммы имеют одну и ту же метку, эта метка должна иметь один и тот же тип в каждом случае.... Но я не спорю, можно ли использовать суммы записей вместо размеченных союзов. Мне просто кажется, что эта система типов несколько отличается, и мне интересно, правильно ли предположить, что она все еще является своего рода системой, основанной на алгебраических типах данных. - person Milo; 04.03.2012