Поддерживает ли какой-либо язык программирования определение ограничений на примитивные типы данных? - PullRequest
5 голосов
/ 21 июня 2011

Прошлой ночью я подумал, что языки программирования могут иметь функцию, с помощью которой мы должны иметь возможность ограничивать значения, назначенные примитивным типам данных.

Например, я должен быть в состоянии сказать, что моя переменная типа int может иметь значение только от 0 до 100

int<0, 100> progress;

Это будет действовать как обычное целое число во всех сценариях, за исключением того факта, что вы не сможете указать значения вне диапазона, определенного в ограничении. Компилятор не будет компилировать код progress=200. Это ограничение может быть перенесено с информацией о типе.

Возможно ли это? Это сделано на каком-либо языке программирования? Если да, то на каком языке и как называется эта техника?

Ответы [ 8 ]

5 голосов
/ 21 июня 2011

Это вообще невозможно.Не имеет смысла использовать целые числа без каких-либо арифметических операторов.С арифметическими операторами у вас есть это:

int<0,100> x, u, v;
...
x = u + v; // is it in range?

Если вы готовы выполнять проверки во время выполнения, то да, несколько основных языков поддерживают это, начиная с Pascal.

4 голосов
/ 21 июня 2011

Я полагаю, что Паскаль (и Delphi) предлагают нечто подобное с типами поддиапазонов .

Я думаю, что это вообще невозможно в Java и в Ruby (ну, в Ruby, вероятно,возможно, но требует определенных усилий).Я не имею ни малейшего представления о других языках.

3 голосов
/ 16 декабря 2011

Ада позволяет что-то вроде того, что вы описываете с диапазонами:

type My_Int is range 1..100;

Поэтому, если вы попытаетесь присвоить My_Int значение, которое меньше 1 или больше 100, Ada сгенерирует исключение Constraint_Error.

Обратите внимание, что я никогда не использовал Аду. Я только читал об этой функции, поэтому сделайте свое исследование, прежде чем погрузиться.

2 голосов
/ 02 января 2012

Конечно!В случае, если вы пропустили это: C. Вы C?Вы не C?Вы не считаете short ограничением для Integer?Итак, C дает вам только предварительно упакованные ограниченные типы.

Кстати: кажется, что ответ, что у Pascal есть поддиапазонные типы, не соответствует их смыслу.В границах массива Pascal нарушения невозможны.Это потому, что индекс массива должен быть того же типа, что и массив, который был объявлен.В свою очередь это означает, что для использования целочисленного индекса вы должны привести его к поддиапазону, а означает, что - это место, где выполняется проверка времени выполнения, не доступ к массиву.

Это очень важная идея, потому что это означает, что цикл for для типа индекса массива может безопасно обращаться к компонентам массива без какой-либо проверки во время выполнения .

2 голосов
/ 22 августа 2011

Это, конечно, возможно.Для этого есть много разных методов, но наиболее популярными являются «зависимые типы».

Ограничения могут даже статически проверяться компилятором во время компиляции.См., Например, Agda2 и ATS (ats-lang.org).

Более слабые формы ваших «типов диапазона» возможны без полностью зависимых типов, я думаю.

Некоторые ключевые слова для поискадля научных работ: - охраняемые типы - типы уточнений - типы поддиапазонов

1 голос
/ 21 июня 2011

Паскаль имеет поддиапазоны.Ада немного расширила это, так что вы можете сделать что-то вроде поддиапазона, или вы можете создать совершенно новый тип с характеристиками существующего типа, но не совместим с ним (например, даже если он был в нужном диапазоне, вы бы нея не могу назначить Integer вашему новому типу на основе Integer).

C ++ не поддерживает идею напрямую, но достаточно гибок, чтобы вы могли реализовать ее, если хотите.Если вы решите поддерживать все составные операторы присваивания (+ =, - =, * = и т. Д.), То это может оказаться большой работой.

Другие языки, поддерживающие перегрузку операторов (например, ML и company), вероятно, может поддерживать его почти так же, как C ++.

Также обратите внимание, что в дизайне есть несколько нетривиальных решений.В частности, если тип используется таким образом, который может / действительно приводит к промежуточному результату, который выходит за пределы указанного диапазона, но дает конечный результат, который находится в пределах указанного диапазона, что вы хотите получить?В зависимости от вашей ситуации это может быть ошибкой или вполне допустимым, и вам придется решить, какой именно.

0 голосов
/ 16 декабря 2011

SQL имеет доменов , которые состоят из базового типа вместе с динамически проверяемым ограничением.Например, вы можете определить домен telephone_number как строку символов с соответствующим количеством цифр, действительным кодом города и т. Д.

0 голосов
/ 21 июня 2011

Я действительно сомневаюсь, что вы можете сделать это.В конце концов, это примитивные типы данных с акцентом на примитив!добавление ограничения сделает тип подклассом его примитивного состояния, расширяя его.

из википедии:

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

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

Так лично, даже если это возможно, я бы не стал делать, так как это плохая практика.Вместо этого просто создайте объект, который возвращает этот тип и ограничения (которые, я уверен, вы подумали об этом решении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...