D有'newtype'吗?

时间:2010-08-26 15:21:40

标签: haskell types d type-systems

D是否具有'newtype'(如在Haskell中)。

这是一个天真的问题,因为我只是略读D,但谷歌并没有发现任何有用的东西。

在Haskell中,这是一种在编译时使不同类型的同一事物不同的方法,但不会导致任何运行时性能损失。

e.g。你可以制作米,秒和公斤的新类型(双打)。如果您的程序以米为单位以数秒为单位添加数量,那么在编译时会出现错误,但在运行时也会像两个都是双精度(它们在运行时)一样快。

如果D没有类似'newtype'的东西,那么处理尺寸数量的方法有哪些?

谢谢,

克里斯。

2 个答案:

答案 0 :(得分:12)

在D1.0中有typedef,这是从预定义类型到'newtype'的强类型。

D2.0删除了这个,只剩下别名(C中的typedef)。有人谈论有一个可以强烈创建新类型的包装器模板。

typedef的问题在于,有一个很好的参数可以使newtype成为预定义类型的子类型,也是使其成为超类型的好参数。

typedef的语义是基类型被隐式转换为newtype,但newtype不会转换为基类型或具有相同基类型的其他类型。我在这里使用基类型:

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

无法编译。

截至目前,2.048 DMD仍允许使用typedef(但不要使用它)。

将基类型转换为newtype非常有用,因此您无需编写

meters = cast(meters) 12.7;

答案 1 :(得分:6)

有趣的是,正如他提到的那样,D1有一个强大的typedef但是没有人使用它,可能是因为无法为每个案例定制确切的语义。处理这种情况的最简单方法,至少对于原始类型,可能是在Phobos中的某个地方包含一个mixin模板,它允许你转发所有操作符,但是有通过mixin自动生成的样板。然后你只需创建一个包装器结构并完成所有设置。