【问题标题】:Does D have 'newtype'?D有'newtype'吗?
【发布时间】:2011-04-04 08:16:06
【问题描述】:

D 是否有“新类型”(如在 Haskell 中)。

这是一个幼稚的问题,因为我只是略读 D,但 Google 没有找到任何有用的东西。

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

例如你可以为米、秒和公斤制作新类型(双打)。如果您的程序将一个以米为单位的数量添加到一个以秒为单位的数量,这将在编译时出错,但在运行时将与两者一样快(它们在运行时)。

如果 D 没有类似于“newtype”的东西,那么处理量纲量的公认方法是什么?

谢谢,

克里斯。

【问题讨论】:

  • 具有适当运算符重载的薄包装类可能会完成工作并得到优化。但这只是一个猜测和一个非常丑陋的解决方案。
  • @delnan:在 D 中你可能会使用结构,而不是类。
  • 有一瞬间我在想:“newtype?..就像在高达???” XD

标签: haskell types d type-systems


【解决方案1】:

在 D1.0 中有 typedef,它是从预定义类型到“新类型”的强类型。

D2.0 已经删除了这个并且只保留了别名(C 中的 typedef 是什么)。有人谈论拥有一个可以强烈创建新类型的包装器模板。

typedef 的问题在于,有很好的论据可以让 newtype 成为预定义类型的子类型,也有很好的论据可以让它成为超类型。

typedef的语义是基类型隐式转换为newtype,但newtype并没有转换为base type或其他具有相同base type的类型。我在这里使用基本类型,因为:

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

编译失败。

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

将基本类型转换为新类型很有用,因此您不必编写

meters = cast(meters) 12.7;

【讨论】:

  • typedef X Y 中,如果X 可以隐式转换为Y 或从Y 转换,那么typedef 不太像Haskell 的newtype
  • @Read Barton,我已经接受了这个答案作为“不,它没有”的答案。
  • @he_the_great,支持新类型成为超类型的论据是什么?我们可以在语言中同时使用 subtypedef 和 supertypedef 吗?
【解决方案2】:

有趣的是,正如 he_the_great 所提到的,D1 有一个强大的typedef,但没有人使用它,可能是因为不可能为每种情况定制确切的语义。处理这种情况的最简单方法可能是,至少对于原始类型来说,是在 Phobos 中的某处包含一个 mixin 模板,它允许您转发所有运算符,但有样板文件通过 mixin 自动生成。然后,您只需创建一个包装器结构并准备就绪。

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 2016-11-01
    • 2010-09-05
    • 2020-03-04
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多