У D есть «новый тип»? - PullRequest
       22

У D есть «новый тип»?

9 голосов
/ 26 августа 2010

Есть ли у D 'newtype' (как в Haskell).

Это наивный вопрос, так как я просто смотрю D, но Google не нашел ничего полезного.

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

Например, вы можете создавать новые типы (удваиваются) для метров, секунд и килограммов.Это приведет к ошибке во время компиляции, если ваша программа добавит количество в метрах к количеству в секундах, но будет так же быстро во время выполнения, как если бы оба были double (что они во время выполнения).

Если D не делаетУ вас нет чего-то аналогичного «новому типу», каковы общепринятые методы для работы с размерными величинами?

Спасибо,

Крис.

Ответы [ 2 ]

12 голосов
/ 26 августа 2010

В D1.0 есть typedef, который является строгой типизацией от предопределенного типа до 'newtype.'

D2.0 удалил это, и остался только псевдоним (что такое typedef в C). Говорят о наличии шаблона оболочки, который может сильно создать новый тип.

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

Семантика typedef заключается в том, что базовый тип неявно преобразуется в новый тип, но новый тип не преобразуется в базовый тип или другие типы с таким же базовым типом. Я использую базовый тип здесь, так как:

typedef int Fish;
typedef Fish Cat;
Fish gold = 1;
Cat fluff = gold;

Не скомпилируется.

И на данный момент 2.048 DMD все еще позволяет использовать typedef (но не использовать его).

Полезно иметь базовый тип, преобразованный в новый тип, поэтому вам не нужно писать

meters = cast(meters) 12.7;
6 голосов
/ 26 августа 2010

Забавно, как упоминает he_the_great, у D1 был сильный typedef, но никто не использовал его, возможно, потому что было невозможно настроить точную семантику для каждого случая. Возможно, самый простой способ справиться с этой ситуацией, по крайней мере для примитивных типов, - это включить шаблон миксина где-нибудь на Фобосе, который позволяет вам переадресовывать всех операторов, но при этом шаблон для этого автоматически генерируется через миксин. Тогда вы просто создадите структуру-обертку и будете готовы.

...