Имеется ли в D 'newtype' (как в Haskell).
Это наивный вопрос, поскольку я просто просматриваю D, но Google не обнаружил ничего полезного.
В Haskell это способ сделать разные типы одного и того же объекта разными во время компиляции, но без каких-либо потерь производительности во время выполнения.
например, вы можете создавать новые типы (двойники) для метры, секунды и килограммы. Это привело бы к ошибке во время компиляции, если бы ваша программа добавляла количество в метрах к количеству в секундах, но было бы так же быстро во время выполнения, как если бы оба были двойными (что они есть во время выполнения).
Если D не имеет что-то похожее на «новый тип», каковы общепринятые методы работы с размерными величинами?
Спасибо,
Крис.
В D1.0 есть typedef, который представляет собой строгую типизацию от предопределенного типа к «новому типу».
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;
Забавно, как упоминает he_the_great, у D1 было строгое typedef
, но никто им не пользовался, возможно, потому, что было невозможно настроить точную семантику для каждого случая. Возможно, самый простой способ справиться с этой ситуацией, по крайней мере, для примитивных типов, состоит в том, чтобы включить где-нибудь в Phobos шаблон миксина, который позволит вам пересылать все операторы, но иметь шаблон для этого, автоматически сгенерированный через миксин. Тогда вы просто создадите структуру-оболочку и все будет готово.