я бездельничал с использованием OCaml реализации некоторых структур данных в чисто функциональных структурах данных Криса Окасаки и наткнулся на этом определении типа:Почему мое определение типа отклонено как циклическое, если оно объявлено как вариант, но принято иначе?
type tree = Node of int * int * tree list;;
Я не думаю, что он нужен тег, как это не было тип союза, поэтому я попытался устранением тега, однако я получил следующее сообщение об ошибке:
# type tree = int * int * tree list;;
Characters 5-33:
type tree = int * int * tree list;;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The type abbreviation tree is cyclic
Почему это происходит с двумя определениями, казалось бы, эквивалентными типа?
Я ничего не знаю о ocaml, но может ли быть так, что без «узла» тип в вопросе означает «int, int и дерево», что означает, что он имеет неизвестный размер? В .NET (в рамках моей привязанности) это будет известно как «структура». В принципе, каждое дерево представляет собой два целых числа + дерево, которое, если вы не разрешаете указатели, которые позволяли бы указывать нулевые указатели (или что бы это было вызвано в ocaml), имели бы неизвестный размер? –
Мой друг только что сказал мне, что это вызвано попытками ML полностью развернуть второй и просто ввести контрольные значения, созданные первым. Поскольку в первом случае бремя лежит на программиста для создания значений, которые заканчиваются. – superlizardmo
Не должен быть вопрос: почему мое определение типа принимается, если оно объявлено как вариант, но отвергнуто как циклическое в противном случае? –